繁体   English   中英

解密preg_match

[英]Decipher preg_match

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

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

当我输入不带空格或任何其他字符的11位数字(英国标准电话长度)时,该数字(来自$_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;

这是您的正则表达式的细目。 我把@扔掉了,因为他使用了@作为边界字符。 通常,您会使用类似/ (请注意regex101.com使用的名称)

[0-9-\+\s\(\)]+$

[]表示我们要匹配的字符集。 您将所有想要匹配的内容放入此处。 破折号表示您有一个范围,因此0-9将匹配所有十进制数字

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

\\s是与空格匹配的特殊类

\\(\\)表示您想匹配任何括号()

$是字符串的结尾(这是不必要的,因为我们需要匹配的任何东西)

我调整了它,这应该可以做您想要的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM