我想转义所有尚未转义的双引号。
我已经在使用real_escape_string(),但我想了解以下正则表达式/方法有什么问题:
$str = '"Hello "" """ world!\"';
preg_replace('/(^|[^\\\\]{1})\"/', '${1}\"', $str);
(PS:我知道 - \\"不会被转义,并且在某些其他情况下可能会成为问题,尽管这对我的脚本无关紧要。)
结果是:
\“你好世界!\”
但我希望它是:
\“你好世界!\”
以下是您逃避 sql 的方法:
$str = mysql_real_escape_string($str);
或者:
$str = mysqli_real_escape_string($str);
或者
$str = *_real_escape_string($str);
// * is your db extention
或者您可以使用 PDO 参数化您的输入。
我认为你在正确的轨道上,但你错过了两个关键要素。首先是您必须在否定字符类中包含引号以及反斜杠:[^"\\]*
。当该部分没有匹配的内容时,下一个字符(如果有的话)必须是引号或反斜杠。
如果是反斜杠,\\.
则使用它和下一个字符,无论它是什么。它可能是引号、反斜杠或其他任何东西;你不在乎,因为你知道它已经被逃脱了。然后你回到用 . 吞噬非特殊字符[^"\\]*
。
另一个缺失的元素是\G
. 它将第一个匹配锚定到字符串的开头,就像\A
. 之后的每场比赛都必须从上一场比赛结束的地方开始。这样,当"
正则表达式中的 final 起作用时,您就知道每个字符都经过检查,并且您确实匹配了一个未转义的引号。
$str = '"Hello "" """ world!\"';
$str = preg_replace('/\G([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/', '$1\"', $str);