我尝试了以下链接中可能包含空格或连字符的 7-12 位电话号码的解决方案。第一个和最后一个字符必须是数字。
但是,我不太了解正则表达式。
$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";
这里的“:”是什么意思?
这个正则表达式如何能够从 6 到 11 个字符中排除连字符和空格?
高度赞赏帮助
我尝试了以下链接中可能包含空格或连字符的 7-12 位电话号码的解决方案。第一个和最后一个字符必须是数字。
但是,我不太了解正则表达式。
$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";
这里的“:”是什么意思?
这个正则表达式如何能够从 6 到 11 个字符中排除连字符和空格?
高度赞赏帮助
是的:
一部分(?: ... )
- 这意味着“非捕获组” - 它对内容进行分组,但不会像正常分组那样创建对它的反向引用(即 $1、$2 等)。
在该正则表达式中,它将匹配 6 到 11 个字符,包括heiphens 和空格 - 这意味着 12-------34 将匹配。我建议使用更严格的模式:
/^\d{7,12}$/
这只会匹配数字。要允许在此匹配中使用 heiphens 和空格,但只获取您想要的数字,您可以像这样使用它:
<?php
$pattern = '/^\d{7,12}$/';
$string = '123-456 789';
$ignoreCharacters = array(' ', '-');
preg_match($pattern, str_replace($ignoreCharacters, $string);
这是可以理解的如何令人困惑。实际表示“(?: ... )
非捕获组”,而不是( ... )
“捕获组”。如果您只是针对正则表达式测试字符串,而不是捕获子字符串,那么两者对于您的目的实际上是相同的。
也存在(?= ... )
, (?! ... )
, (?<= ... )
, (?<! ... )
, and也无济于事,它们也(?<foo> ... )
都意味着不同的东西。
很多东西要学,但肯定有收获!
您是否尝试过像正则表达式这样的测试引擎(也有其他可用的)我经常使用它来针对表达式测试各种字符串,以确保它们的行为符合预期。
我的理解是,在这种情况下:不是单独行动,而是与?
? _ 在这种情况下并不意味着前面零次或一次它是修饰符的含义,赋予该组一个新的含义,与修饰符一起使用:关闭捕获意味着您希望这是一个非捕获组表达式。
这样做的效果是,当将表达式的一部分放在()中时,默认情况下会导致捕获但?:将其关闭。
因此 (?:[-\s]?\d) 成为非捕获组表达式。
注意捕获的组与反向引用一起使用,大多数正则表达式引擎支持多达 9 个反向引用。
因此,删除捕获加快了匹配过程,并允许您选择不回溯该组,从而为您真正想要回溯的组保存 9 个引用中的一个。