0

引用符内の文字列を取得しようとしています。正規表現を使用していますが、エスケープされた引用符に問題があります。

たとえば、私はこれを持っています:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman'";
preg_match_all('~([\'"])(.*?)\1~s', $var, $result);
$new = preg_replace('~([\'"])(.*?)\1~s',"<#################>",$var);

コードは完璧に機能します。$new で置き換えられた値と $result[1] で引用された値を取得しました

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>";
$result[1] = "Carasuman";

私の問題は、引用符の中にエスケープされた引用符を追加するときです:

$var = "SELECT * FROM TABLE WHERE USERNAME='Carasuman\'s'";

私はこれを得た:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>'s";
$result[1] = "Carasuman\" //must be "Carasuman\'s";

このエラーを回避し、最初の例のように $new と $result[1] を取得するにはどうすればよいですか?:

$new = "SELECT * FROM TABLE WHERE USERNAME=<#################>";
$result[1] = "Carasuman\'s";

ありがとう!

4

3 に答える 3

1

一致の場合、単一の一致内で文字をスキップして一致させることができるため、単一の一致要素として\なしでCarasumanを取得することはありません。Carasumanを取得するか、Carasuman使用してバックスラッシュを取り除くだけです。

preg_match_all('~([\'"])(.*)\1~s', $var, $result);
$result[2] = str_replace('\\','',$result[2]);

交換の場合、?(。*?)グループでは、貪欲になりません。つまり、最初の試合で停止します。?を削除します in(。*?)で貪欲にします。つまり、最後の試合まで続きます。

preg_replace('~([\'"])(.*)\1~s',"<#################>",$var);

編集

$ result [2]での一致後にstr_replaceを実行するよりも、次のように最初の文字列で事前に実行する方がおそらく良いでしょう。

$var = str_replace("\\'","'",$var); 
preg_match_all('~([\'"])(.*)\1~s', $var, $result);
$new = preg_replace('~([\'"])(.*)\1~s',"<#################>",$var);

名前のアポストロフィを終了の一重引用符としてカウントするのではなく、一致/置換に含めるには、ワイルドカードを(。*?)から(。*)のように貪欲に一致させる必要があります。

于 2012-09-28T21:02:59.813 に答える
0

なぜあなたはこれをしないのですか:

$var = "SELECT * FROM TABLE WHERE USERNAME='" . mysql_real_escape_string($input) . "'";

必ずしも正規表現を行う必要はないと思います。また、mysql_real_escape_string は入力を適切にエスケープするため、$input = 'Carasuman\'s';または$input = "Carasuman's";

于 2012-09-28T20:44:58.887 に答える
0

'\'.*?(?:\\\\.[^\\\\\']*)*\''引用符で囲まれた文字列を照合するには、正規表現と 4 つの二重引用符で囲まれた文字列を使用できます'".*?(?:\\\\.[^\\\\"]*)*"'

于 2012-09-28T20:49:05.997 に答える