PHP - preg_match混淆 - 没有检查正确的字符集 - 需要空格

时间:2015-06-07 16:56:30

标签: php preg-match

我正在构建一个将在其中包含地址的应用程序,并且我正在使用preg_match进行一些字符检测,如果用户使用无效字符以确保其安全,则会引发用户错误。

我的问题是使用preg_match它似乎表现得很奇怪,我不认为我正确使用它是因为它的表现如何。

下面的代码应该允许城市,郡和国家的字母A到Z,大写和小写。以下代码是该字段更新时城市的示例:

// The user wants to update the city so let's go through the update process
if ( isset($_POST['city']) ) {

    // Check that the city is different before we try to update it
    if ( $newcompanycity != $companycity ) {

        // Check that the city is less than 50 characters and contains valid characters
        if ( (strlen($newcompanycity) <= 50) && (preg_match('/[^A-Za-z]/', $newcompanycity)) ) {

            // The city is fine so let's update it
            $update_success = true;
            mysqli_query($sql, "UPDATE clients SET city = '$newcompanycity' WHERE companyid = '$companyid'") or die(mysqli_error($sql));

        } else {

            // The city doesn't meet the requirements to be update so return an error
            $update_fail = true;
            $city_error = true;

        }

    }

}

现在的问题是,当前值为“谢菲尔德”时会触发$city_error并且您将其更改为“约”,它会在$city_error变量变为真时返回错误。但是,将值从“Sheffield”更改为“Sheffield 1”,然后它将工作并更新数据库。

我在这里遗漏了什么吗?我认为A-Za-z只检查字母,如果只有字母那么它应该有效。但这似乎根本不起作用。

我发布之前只是快速更新。我刚刚意识到我需要在字符串的末尾添加一个空格然后它才能工作。我真的很困惑。因此,如果没有空格,它会返回错误,因为preg_match不允许它,但是即使它没有在preg_match中定义,它也允许使用空格。当然这不是正常行为吗?

2 个答案:

答案 0 :(得分:1)

有时regexp只会使事情变得更复杂。 PHP有一个很好的函数ctype_alpha(),它将检查变量是否只是A-Za-z。

(ctype_alpha($newcompanycity))

这里是working example for you

答案 1 :(得分:1)

你的正则表达式是/[^A-Za-z]/,这意味着&#34;所有不是A-Z和a-z&#34;的东西。 preg_match函数返回匹配数,因此如果未找到无效字符,则应返回0.

因此,如果您将(preg_match('/[^A-Za-z]/', $newcompanycity))更改为(preg_match('/[^A-Za-z]/', $newcompanycity) === 0),它应该按预期工作,如果找不到无效字符,它就会变为真。

要包含空格,只需将它们添加到正则表达式:/[^A-Za-z ]/