我正在构建一个将在其中包含地址的应用程序,并且我正在使用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中定义,它也允许使用空格。当然这不是正常行为吗?
答案 0 :(得分:1)
有时regexp只会使事情变得更复杂。 PHP有一个很好的函数ctype_alpha()
,它将检查变量是否只是A-Za-z。
(ctype_alpha($newcompanycity))
答案 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 ]/
。