正则表达式的问题

时间:2011-06-02 19:11:49

标签: php regex

我有这个代码,但是没有像我期望的那样工作。

如果我写#$%或textwithouterrors,则显示的信息是“正确的”。所以,正则表达式不起作用。

我需要避免使用特殊字符,空格和数字

function validateCity($form) {
    if(preg_match("/[\~!\@#\$\%\^\&*()_+\=-[]{}\\|\'\"\;\:\/\?.>\,\<`]/", $form['city'])) {
        echo ("error");
        return false;
    }
    else {
        echo("correct");
        return true;
    }

}

validateCity($form);

感谢

6 个答案:

答案 0 :(得分:5)

有很多问题 - 应该将hypen -移动到第一个或结束或转义,否则它将被视为指示范围。 []必须转义。

http://gskinner.com/RegExr/

等某个地方试试你想要的东西

此外,你还包括很多东西。只需使用\w+之类的匹配作为有效的匹配,而不是寻找无效的匹配。

答案 1 :(得分:3)

尝试颠倒你的逻辑。寻找你想要的角色,而不是你不想要的角色。

答案 2 :(得分:2)

这里有几个问题。最严重的一个是你的正则表达式中存在语法错误:到目前为止,我注意到[]-都在你的角色类中未转义。我有点惊讶的是,正则表达式引擎没有错误地从那些错误,因为它们在技术上导致未定义的行为,但PHP往往非常容忍这些事情。无论哪种方式,它都没有做你想象的那样。

在担心这一点之前,请解决第二个问题:您将字符列入黑名单,但您应该使用白名单。这将大大简化你的模式,你不必担心像▲滑过你的正则表达式这样的疯狂角色。

如果你想要匹配城市,我会选择这样的事情:

if(preg_match("/[^\p{L}\s-]/", $form['city'])) {
    echo ("error");
    return false;
}
//etc...

这将允许字母,短划线(想想温斯顿 - 塞勒姆,北卡罗来纳州)和空白(想想纽黑文,CT),同时阻止其他一切。这可能过于严格,我不知道;任何知道名字中有数字的城镇的人都欢迎发表评论。但是,\p{L}应匹配unicode字母,因此Āhualoa,HI应该有效。

答案 3 :(得分:1)

您似乎想检查您的城市名称是否包含任何非字母字符。在这种情况下,您可以将其简化为:

 if (preg_match("/[^A-Z]/i", $form['city'])) {

答案 4 :(得分:0)

字符集有一个未转义的“]”,看起来像是集合的结尾。

答案 5 :(得分:0)

您需要在角色类中转义[]