我正在尝试修复其他开发人员编写的一些代码:
$rexSafety = '@[0-9-\+\s\(\)]+$@';
if (!preg_match($rexSafety, $_POST['phone'])) $spam = true;
当我输入一个11位数字(英国标准手机长度),没有空格或任何其他字符时,该号码(来自$_POST['phone']
)被标记为垃圾邮件。
不幸的是我对正则表达式一无所知,所以我希望有人能够“破译”这个并告诉我它的期望是什么?
01234567890
应该匹配。它目前不是。
答案 0 :(得分:1)
如果您想检查11位数,则为only alphanumerics keywords are allowed, pr\u00f3ximo is not a valid keyword
\d{11}
如果带有空格,短划线等的格式有效(不知道英国电话号码),请先删除这些字符以获得普通号码。
$rexSafety = '~^\d{11}$~';
if (!preg_match($rexSafety, $_POST['phone'])) $spam = true;
答案 1 :(得分:1)
这是你的正则表达式的细分。我抛弃了@
,因为他用那些作为边界字符。通常你会使用/
之类的东西(注意regex101.com使用的东西)
[0-9-\+\s\(\)]+$
[]
表示我们想要匹配的字符集。你把所有想要匹配的东西放在这里。短划线表示您有一个范围,因此0-9
将匹配所有十进制数
\
是转义字符。这意味着你需要文字字符。因此\+
将匹配字符串中的+
\s
是一个匹配空格的特殊类
\(\)
表示您要匹配任何括号(
或)
$
是你的字符串的结尾(这是不必要的,因为我们想要任何匹配的东西)
我调整了它,这应该做你想要的
if(preg_match('/([^0-9-\+\s\(\)])/', $_POST['phone'])) $spam = true;
添加^
我们告诉正则表达式我们不希望此类中的任何内容都匹配。我还将它包裹在括号中以使其成为捕获组。这意味着它将获取匹配的元素并返回它们