3

我想转义所有尚未转义的双引号。

我已经在使用real_escape_string(),但我想了解以下正则表达式/方法有什么问题:

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

(PS:我知道 - \\"不会被转义,并且在某些其他情况下可能会成为问题,尽管这对我的脚本无关紧要。)

结果是:

\“你好世界!\”

但我希望它是:

\“你好世界!\”
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

我认为你在正确的轨道上,但你错过了两个关键要素。首先是您必须在否定字符类中包含引号以及反斜杠:[^"\\]*。当该部分没有匹配的内容时,下一个字符(如果有的话)必须是引号或反斜杠。

如果是反斜杠,\\.则使用它和下一个字符,无论它是什么。它可能是引号、反斜杠或其他任何东西;你不在乎,因为你知道它已经被逃脱了。然后你回到用 . 吞噬非特殊字符[^"\\]*

另一个缺失的元素是\G. 它将第一个匹配锚定到字符串的开头,就像\A. 之后的每场比赛都必须从上一场比赛结束的地方开始。这样,当"正则表达式中的 final 起作用时,您就知道每个字符都经过检查,并且您确实匹配了一个未转义的引号。

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