如何立即逃避报价?

时间:2013-01-07 02:51:11

标签: php regex

我想要转义所有未经过转义的双引号。

我已经使用 real_escape_string(),但我希望了解跟随正则表达式/方法有什么问题:

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

(PS:我知道 - \\“不会被转义,在其他一些情况下可能会出现问题,尽管这对我的剧本无关紧要。)

结果是:

\"Hello \"" \""\" world!\"

但我希望它是:

\"Hello \"\" \"\"\" world!\"

2 个答案:

答案 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);