php regex:电话号码7-12位可能包含连字符或空格

时间:2012-10-03 08:09:05

标签: php regex phone-number

我尝试了7-12位数字的电话号码解决方案,可能在以下链接中包含空格或超量。第一个和最后一个字符必须是数字。

Regular expression to match 7-12 digits; may contain space or hyphen

但是,我不太了解正则表达式。

$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";

“:”在这里意味着什么?

这个正则表达式如何能够从6到11个字符中排除超量和空格?

非常感谢帮助帮助

3 个答案:

答案 0 :(得分:4)

:(?: ... )的一部分 - 这意味着“非捕获组” - 它对内容进行分组,但不会像正常分组那样创建对它的反向引用(即$ 1,$ 2等)确实

在该正则表达式中,它将匹配6到11个字符,包括 heiphens和space - 它意味着类似12 ------- 34的匹配。我建议使用更严格的模式:

/^\d{7,12}$/

这只会匹配数字。要通过此匹配允许heiphens和space,但只获得所需的数字,您可以像这样使用它:

<?php
$pattern = '/^\d{7,12}$/';
$string = '123-456 789';
$ignoreCharacters = array(' ', '-');

preg_match($pattern, str_replace($ignoreCharacters, $string);

答案 1 :(得分:3)

可以理解这是多么令人困惑。 (?: ... )实际上表示“非捕获组”,而不是( ... ),它是“捕获组”。如果您只是针对正则表达式测试字符串,而不是捕获子字符串,那么这两者实际上是相同的。

同样存在(?= ... )(?! ... )(?<= ... )(?<! ... )(?<foo> ... ),这些都意味着不同的事情也无济于事

需要学习很多,但肯定会有所回报!

答案 2 :(得分:2)

您是否尝试过像regexpal这样的测试引擎(还有其他可用的)我经常使用它来测试表达式的各种字符串,以确保它们按预期运行。

我的理解是,在这种情况下,不单独行动,它与一起行动?

在这种情况下并不意味着前置零或一次它是一个修饰符意味着给这个组一个新的含义,它与修饰符一起关闭捕获意味着您希望这是一个非捕获组表达式。

这样做的效果是,当将表达式的一部分放在()中时,默认会导致捕获,但?:会将其关闭。

因此(?:[ - \ s]?\ d)成为非捕获组表达。

注意捕获的组与后引用一起使用,大多数正则表达式引擎最多支持9个后引用。

因此,删除捕获会加快匹配过程,并允许您选择不再引用该组,从而为您真正想要引用的组保存9个引用中的一个。