2011-11-03 6 views
1

私はこれで夢中になると思います...REGEXP:PHP変数の内容、つまり代入自体を取得します。具体的には、SQLクエリで変数を検索する

私は多くの組み合わせを試してみました。

file_get_contents()で読み取った後、すべてのSQLクエリをPHPコードで検索する必要があります。もちろん

、すべてのこれらのクエリは次のように変数assignationsです:だからあなたが取るに多くの要因があることがわかります

$sql1 = " 
    SELECT * 
    FROM users u 
    WHERE u.name LIKE '%".$name."%' AND ... ; 
"; 

または

$sql2 = " 
    SELECT * 
    FROM users u 
    WHERE u.id = ".$user_id; 

または

$sql3 = ' 
    SELECT * 
    FROM users u 
    ORDER BY u.surname1 DESC 
'; //this query blablabla....... 

PHP変数のアカウント。私はあまりにも正規表現パターンにSQLから特定の単語を見つけることを試みてきました

私は変数それはコンテンツだ取得と組み合わせて自分自身を得ることに基づいて近似して試してみたまず...

...

何でも...

私はそれを行う方法がわかりません。

  1. 逢引をグループ化し、それの後に、特別なSQLの単語を検索マッチをループ、すべての変数を取得し、それが逢引だ(それは私が今きたものだが、それが原因の逢引の正規表現の部分を動作しません) 。

  2. 正当な正規表現を使用してSQLクエリを直接検索しますか?

PHP変数(特に文字列)は、他の変数、二重引用符と一重引用符で囲まれた文字列と部分的に連結されています。途中で...

どうすればいいですか?これらの

//$regex_sql = '(["\'])(.*?)\2\s*;'; 
//$regex_sql = '(["\'])([^;]*?)\2\s*;'; 
//$regex_sql = '(?<!")\b\w+\b|(?<=")\b[^"]+'; 
//$regex_sql = '([^;]+)(?<=["\']);(?!["\'])'; 
//$regex_sql = '(.*?;)[^\\$]*'; 

なしが正常に動作しません:私は、私は別のフォームを試してみたの$ regex_sqlと連結

$regex_variable = '\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*[\+\-\*\/\%\.\&\|\^\<\>]*=\s*'; 

はこれまでのところ、それは私の変数正規表現の一部です。

お願いします。私はそれがすべての変数自体を取得している最良の近似であると確信しています。その後、SELECT、WHERE、UNION、ORDERのような特別なSQL単語を含むための割り当てをテストします...

あまり前もって感謝!

マーク。

編集:

はもちろん、クエリを持つ変数は、フォームのいずれかの種類を持っていることができることを追加します。上記は単純な例です。私たちは、そのようなことを話している

$s = 'insert into tabletest(a,b,c) values('asd','r32r32','fdfdf')'; 

または

$where = 'where a=2'; 
$sql="select distinct * from test ".$where; 

または

$a = ' 
select * 
from users 
left outer join ... 
inner join ... 
left join ... 
where ... 
group by ... 
having ... 
order by ... 
limit ... 
... 
'; 

または

...

多くのプログラマーがコード内でクエリを作成し、自分のやり方でそれをやっている人を想像してください:\

私はそれらのすべてを手に入れました。少なくとも、結果を最大化してください...

答えて

1

私は、PHP Tokenizerを見てみることをお勧めします。あなたはあなたのソースをトークン化するためにそれを使うことができます(つまり、理解しやすいように解析します)。各トークン;がコード行を終了することを知り、要件に合致する文字列と変数のトークン。

0

これはあなたが探しているものであるかどうかを知るしないでください:

preg_match_all('/\$.*?=(.*?)(?<=[\'"]);/s', $subject, $result, PREG_PATTERN_ORDER); 
$result = $result[1]; 

これは、すべての割り当て(assignations)は$結果に保存されています。私はあなたのすべてのサンプルでそれをテストしました。

あなたが何か他のものを望むなら、ごめんなさい。

説明:

" 
\$   # Match the character “\$” literally 
.   # Match any single character 
    *?   # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
=   # Match the character “=” literally 
(   # Match the regular expression below and capture its match into backreference number 1 
    .   # Match any single character 
     *?   # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
) 
(?<=  # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) 
    ['\"]  # Match a single character present in the list “'\"” 
) 
;   # Match the character “;” literally 
" 
関連する問題