【问题标题】:php regex: phone number 7-12 digits may contain hypen or spacephp 正则表达式:电话号码 7-12 位可能包含连字符或空格
【发布时间】:2012-09-24 03:16:07
【问题描述】:

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

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

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

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

这里的“:”是什么意思?

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

非常感谢您的帮助

【问题讨论】:

  • 您究竟需要什么帮助?你有一个解决方案,你需要解释一下吗?或者你想匹配不同的东西。

标签: php regex phone-number


【解决方案1】:

您是否尝试过像正则表达式这样的测试引擎(也有其他可用的)我经常使用它来针对表达式测试各种字符串,以确保它们的行为符合预期。

我的理解是,在这种情况下,: 不是单独行动,而是与 ?

一起行动

这种情况下的?并不意味着前面的零次或一次它是一个修饰语意思是给这个组一个新的含义,它与修饰语结合使用:关闭capture 表示您希望这是一个非捕获组表达式。

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

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

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

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

【讨论】:

  • 好的,我明白了。这是否意味着在验证正则表达式时不会包含空格和连字符?只有数字会被验证?
  • @vaanipala 否,该组仍应用于匹配过程。但是您无法反向引用该组。
【解决方案2】:

:(?: ... ) 的一部分 - 这意味着“非捕获组” - 它对内容进行分组,但不会像正常分组那样创建对其的反向引用(即 $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);

【讨论】:

  • 我不知道什么是非捕获组。我想我必须阅读很多。感谢您的精彩解释!
  • 您使用方括号捕获匹配项并将它们放入“回调” - $1、$1 等。如果您想使用方括号而不将它们放入回调中,请使用 (?: ) - 它分组相同,只是没有将引用放入 $1、$2、$3 等 :)
  • 你能告诉我反向引用和非捕获组的目的是什么吗?这对我来说似乎是高级正则表达式。我一无所知。我只了解简单的正则表达式。请帮忙。谢谢。
  • 我找到了这个很棒的链接regular-expressions.info/brackets.html,我现在正在阅读。如果我有疑问,我会告诉你。
  • 如果您想对一组规则应用重复 - 即可选地(零次或一次)匹配字符串“Hello”后面有任意位数,您可以先将正则表达式写入匹配字符串:Hello\d+,然后将其包装在一个组中,这样您就可以添加零个或一个重复 ? 字符:(Hello\d+)?。如果你没有括号,它只会在它之前的\d+ 上应用?不是整个事情,所以你使用括号对内容进行分组。与( .. ) 分组会创建一个回调(在我们的例子中是$1),但是如果我们不想创建那个$1 反向引用,我们可以使用(?: )
【解决方案3】:

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

(?= ... )(?! ... )(?&lt;= ... )(?&lt;! ... )(?&lt;foo&gt; ... ) 也无济于事,它们的含义也各不相同。

要学习很多东西,但肯定会有所收获!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2011-08-27
    • 2019-05-23
    相关资源
    最近更新 更多