我有这个代码,但是没有像我期望的那样工作。
如果我写#$%或textwithouterrors,则显示的信息是“正确的”。所以,正则表达式不起作用。
我需要避免使用特殊字符,空格和数字
function validateCity($form) {
if(preg_match("/[\~!\@#\$\%\^\&*()_+\=-[]{}\\|\'\"\;\:\/\?.>\,\<`]/", $form['city'])) {
echo ("error");
return false;
}
else {
echo("correct");
return true;
}
}
validateCity($form);
感谢
答案 0 :(得分:5)
有很多问题 - 应该将hypen -
移动到第一个或结束或转义,否则它将被视为指示范围。 []
必须转义。
此外,你还包括很多东西。只需使用\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)
您需要在角色类中转义[
和]
。