PHP preg_match与'不起作用

时间:2012-06-20 09:08:47

标签: php preg-match

我需要过滤掉除字母,数字,点,连字符,撇号或空格以外的任何字符串。

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

对此有何想法?

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

2 个答案:

答案 0 :(得分: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"; 
} 

答案 1 :(得分:0)

试试这个:

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