2012-06-20 69 views
0

我需要过滤掉字母,数字,点,连字符,撇号或空格以外的字符串。PHP preg_match'不起作用

字母,数字,点,连字符和空格字符串通过测试,但是当它们包含撇号时,它会失败。 (点和连字符上的转义字符似乎没有任何区别,所以我只是为了确定它们)

对此有何看法?

if (preg_match("/[^a-zA-Z0-9\.\-\'\\s]/", $some_var)){ 
    echo "Invalid characters"; 
} 
+1

您不需要转义任何这些字符。 '''可以简单地移到课程的开始/结束处。 – ThiefMaster

+0

\\ s不正确 –

回答

1

你的回答不编译由于某些字符转义(转义为一个字符串,前传入的preg_match功能的一部分)。

你可以尝试双转义:

if (preg_match("/[^a-zA-Z0-9\\.\\-\\'\s]/", $some_var)){ 
    echo "Invalid characters"; 
} 

但逃脱点,连字符和撇号是不需要的,所以您可以简化:

if (preg_match("/[^a-zA-Z0-9.'\s-]/", $some_var)){ 
    echo "Invalid characters"; 
} 

注意,连字符被移动到最后,所以它不会被误认为一个字符范围。就我个人而言,我宁愿逃避它以防止其他开发人员意外地将新字符添加到列表的末尾并导致意外的行为。

这样:

if (preg_match("/[^a-zA-Z0-9.\\-'\s]/", $some_var)){ 
    echo "Invalid characters"; 
} 

最后,你可能要检查你的输入($some_var变量) - 这实际上包含反斜杠作为PHP有​​时会在(例如,用户类型添加此“不能“,但会通过”无法“发送 - 您可能需要先登录stripslashes)。

例如,

if (preg_match("/[^a-zA-Z0-9.\\-'\s]/", stripslashes($some_var))){ 
    echo "Invalid characters"; 
} 
+0

这确实是由于斜杠。 –

0

试试这个:

if (preg_match("/[^a-zA-Z0-9.'\s-]/", $some_var)){ 
     echo "Invalid characters"; 
} 
+0

仍然相同:/ –

+3

*“试试这个:”*是[subpar answer decoration](http://stuck.include-once.org/#help10)。相反,请给你的代码做些什么,为什么要推荐它,或者你如何得出结论。 – mario