3

まだエスケープされていないすべての二重引用符をエスケープしたいと思います。

私はすでにreal_escape_string()を使用していますが、次の正規表現/アプローチの何が問題になっているのかを理解したいと思います。

$str = '"Hello "" """ world!\"';
preg_replace('/(^|[^\\\\]{1})\"/', '${1}\"', $str);

(追記:私は知っています- \ \ "はエスケープされず、他の場合には問題になる可能性がありますが、これは私のスクリプトには関係ありません。)

結果は次のとおりです。

\"こんにちは世界!\"

しかし、私はそれを次のようにしたかった:

\"こんにちは世界!\"
4

2 に答える 2

3

SQLをエスケープする方法は次のとおりです。

$str = mysql_real_escape_string($str);

また:

$str = mysqli_real_escape_string($str);

また

$str = *_real_escape_string($str);
// * is your db extention 

または、PDOを使用して入力をパラメータ化することもできます。

于 2013-01-07T02:58:37.830 に答える
2

あなたは正しい方向に進んでいると思いますが、2つの重要な要素が欠けています。1つ目は、否定された文字クラスにバックスラッシュとともに引用符を含める必要があることです[^"\\]*。その部分に一致するものがなくなった場合、次の文字(存在する場合)は引用符または円記号である 必要があります。

バックスラッシュの場合\\.は、それが何であれ、それと次の文字を消費します。引用符、円記号、またはその他のものである可能性があります。あなたはそれが逃げられたことを知っているので気にしません。次に、。を使用して非特殊文字をゴブリングすることに戻ります[^"\\]*

他の欠落している要素は\Gです。のように、最初の一致を文字列の先頭に固定します\A。その後の各試合は、前の試合が終了した場所から開始する必要があります。このように"、正規表現の決勝戦が登場すると、それが調べられる前のすべてのキャラクターがわかり、実際にエスケープされていない引用符と一致します。

$str = '"Hello "" """ world!\"';
$str = preg_replace('/\G([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/', '$1\"', $str);
于 2013-01-07T09:13:03.350 に答える