解密preg_match

时间:2015-04-28 15:07:56

标签: php regex

我正在尝试修复其他开发人员编写的一些代码:

 $rexSafety = '@[0-9-\+\s\(\)]+$@';
 if (!preg_match($rexSafety, $_POST['phone'])) $spam = true;

当我输入一个11位数字(英国标准手机长度),没有空格或任何其他字符时,该号码(来自$_POST['phone'])被标记为垃圾邮件。

不幸的是我对正则表达式一无所知,所以我希望有人能够“破译”这个并告诉我它的期望是什么?

01234567890应该匹配。它目前不是。

2 个答案:

答案 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;

添加^我们告诉正则表达式我们希望此类中的任何内容都匹配。我还将它包裹在括号中以使其成为捕获组。这意味着它将获取匹配的元素并返回它们