[英]php regex: phone number 7-12 digits may contain hypen or space
我尝试了以下链接中包含7-12位数字的电话号码的解决方案,其中可能包含空格或连字符。 第一个和最后一个字符必须是数字。
但是,我不太了解正则表达式。
$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";
“:”在这里是什么意思?
此正则表达式如何排除6到11个字符中的连字符和空格?
帮助帮助受到高度赞赏
:
是(?: ... )
-意思是“非捕获组”-它对内容进行分组,但不像常规分组那样对它创建反向引用(即$ 1,$ 2等)。
在该正则表达式中,它将匹配6到11个字符, 包括连字符和空格-这意味着将匹配12 ------- 34之类的东西。 我建议使用更严格的模式:
/^\\d{7,12}$/
这只会匹配数字。 要在此匹配中允许使用连字符和空格,但仅获取所需的数字,可以这样使用:
<?php
$pattern = '/^\d{7,12}$/';
$string = '123-456 789';
$ignoreCharacters = array(' ', '-');
preg_match($pattern, str_replace($ignoreCharacters, $string);
令人困惑的是可以理解的。 (?: ... )
实际上表示“非捕获组”,与( ... )
相反,后者是“捕获组”。 如果您仅针对正则表达式测试字符串,而不捕获子字符串,则对于您的目的,两者实际上是相同的。
也存在(?= ... )
, (?! ... )
, (?<= ... )
, (?<! ... )
和(?<foo> ... )
(?<! ... )
并没有帮助(?<foo> ... )
,这也意味着不同的事物。
有很多东西要学,但肯定会有所收获!
您是否尝试过像regexpal这样的测试引擎(也可以使用其他引擎),我经常使用它来针对表达式测试各种字符串,以确保它们的行为符合预期。
我的理解是,在这种情况下:不是单独行动,而是与?
? 在这种情况下,并不意味着它是0或1之前的修饰语,这意味着给该组一个新的含义,并与修饰语结合使用:关闭捕获意味着您希望它成为一个非捕获组表达式。
这样做的效果是,在默认情况下将表达式的一部分放入()时,它将导致捕获,但?:将其关闭。
因此(?:[-\\ s]?\\ d)成为非捕获组表达式。
注意捕获的组与反向引用一起使用,大多数正则表达式引擎最多支持9个反向引用。
因此,删除捕获可加快匹配过程,并允许您选择不返回该组,从而为您确实希望返回的组保存9个参考中的一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.