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