Php 解密预匹配

Php 解密预匹配,php,regex,Php,Regex,我正在尝试修复其他开发人员编写的一些代码: $rexSafety = '@[0-9-\+\s\(\)]+$@'; if (!preg_match($rexSafety, $_POST['phone'])) $spam = true; 当我输入一个11位数的号码(英国标准电话长度),没有空格或任何其他字符时,该号码(来自$\u POST['phone'])被标记为垃圾邮件 不幸的是,我对正则表达式一无所知,所以我希望有人能够“解读”它,并告诉我它期望什么 01234567890应为匹配项。当

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

 $rexSafety = '@[0-9-\+\s\(\)]+$@';
 if (!preg_match($rexSafety, $_POST['phone'])) $spam = true;
当我输入一个11位数的号码(英国标准电话长度),没有空格或任何其他字符时,该号码(来自
$\u POST['phone']
)被标记为垃圾邮件

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


01234567890
应为匹配项。当前不是。

如果要检查11位数字,则为
\d{11}

 $rexSafety = '~^\d{11}$~';
 if (!preg_match($rexSafety, $_POST['phone'])) $spam = true;
如果带有空格、破折号等的格式有效(不知道英国电话号码),请首先删除这些字符以获得普通号码

$phone = str_replace(array(' ', '-'), '', $_POST['phone']); // remove spaces & dashes
$rexSafety = '~^\d{11}$~';
if (!preg_match($rexSafety, $phone)) $spam = true;

这是你的正则表达式的分类。我扔掉了
@
,因为他用这些字符作为边界字符。通常情况下,您会使用类似于
/
的内容(请注意,这就是它的用途)

[]
表示要匹配的字符集。你把你想要的东西都放在这里。破折号表示您有一个范围,因此
0-9
将匹配所有十进制数字

\
是转义字符。这意味着您需要文字字符。所以
\+
将匹配字符串中的
+

\s
是一个与空白匹配的特殊类

\(\)
表示要匹配任何括号

$
是字符串的结尾(这是不必要的,因为我们需要匹配的内容)

我调整了它,这应该做你想要的

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

通过添加
^
我们告诉regex我们不希望这个类中的任何内容匹配。我还将其包装在括号中,使其成为一个捕获组。这意味着它将获取匹配元素并返回它们

这是一个了解regexp的好网站。请添加一个与regexp不匹配的英国电话号码示例和一个匹配的号码。Hi@Bolza-01234567890应该是匹配的。目前还没有(根据我试图修复的站点代码和Med指向regex101.com的链接)。我不知道什么匹配-这是我的问题。这个正则表达式试图匹配什么?什么能让它成功?谢谢黑豹。你知道原始问题中的正则表达式实际上想要匹配什么吗?你能破译它吗?正如我所说,我正在尝试修复其他人的代码,但我不知道这个正则表达式试图匹配什么-我只知道它失败了!以至少以下一个字符结尾的所有内容:
number、、+、space/tab/new line、(,)
。关于开头的任何内容(例如
abc12(+1
)都不应有效,因为它以允许的字符结尾。
if(preg_match('/([^0-9-\+\s\(\)])/', $_POST['phone'])) $spam = true;