我需要过滤掉除字母,数字,点,连字符,撇号或空格以外的任何字符串。
带有字母,数字,点,连字符和空格的字符串通过测试,但是当它们包含撇号时,它会失败。 (点和连字符上的转义字符似乎没有任何区别,所以我把它们放进去只是为了确定)
对此有何想法?
if (preg_match("/[^a-zA-Z0-9\.\-\'\\s]/", $some_var)){
echo "Invalid characters";
}
答案 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";
}