【问题标题】:Regex to Get Phone Numbers From String正则表达式从字符串中获取电话号码
【发布时间】:2018-03-13 01:23:15
【问题描述】:

我正在尝试从如下所示的文本字符串中提取电话号码:

Some address at some street (123) 456-7890

这是我正在使用的当前正则表达式,但它不会从字符串中提取电话号码:

/^(\d[\s-]?)?[\(\[\s-]{0,2}?\d{3}[\)\]\s-]{0,2}?\d{3}[\s-]?\d{4}$/i

无论如何,我都不是正则表达式专家,因此我们将不胜感激。如果可能的话,我希望正则表达式能够识别任何美国电话号码格式,例如:

(123) 456-7890
(123)-456-7890
123 456 7890
123-456-7890
etc...

【问题讨论】:

  • 例如以+31 开头的数字呢?还是手机号码?还是只写电话号码而没有分隔符的人?
  • 看起来您的正则表达式用于匹配电子邮件:-/
  • ...+1 123 4567890 呢。使用正则表达式解析电话号码是一个糟糕的主意。每次你认为你已经涵盖了所有情况时,一种新的格式会从不需要的数字格式中出现。
  • @Aaron ... 做得很糟糕
  • @CD001 它肯定不符合 RFC822 ;我会在任何地方认出this monster

标签: php regex


【解决方案1】:

您的正则表达式是“锚定的”,即包含在元字符 ^$ 之间,它们分别代表字符串的开头和结尾。

它会正确验证电话号码,但不适合在字符串中间进行搜索(因为该号码通常不会从字符串的开头开始,也不会在结尾处结束)。

删除这两个字符,你应该很好(否则向我们展示你的 PHP 代码)。

请注意,正则表达式匹配的格式比您列出的格式要多,但由于我不是美国公民,所以我认为这是预期的。

Here 是一个 regex101 示例,表明它在移除锚点后按预期工作。

【讨论】:

  • 您的链接模式不是很紧密。它匹配电话号码开始之前的空白字符。
  • @mickmackusa 这是没有锚点的 OP 模式。我不熟悉美国的电话号码计划,所以我不会尝试生成一个能够密切满足 OP 需求的正则表达式,我只是帮助他解决了他宣布的问题。 TBH 我注意到这个领先的空间问题并试图修复它但无济于事。告诉我,如果你成功了,我会在我的答案中添加一个修订版!
  • 我很想将此问题标记为重复问题,因为 StackOverflow 上有很多很多与 regexphone numbers 相关的问题,还有一些专门针对美国电话号码的问题。我选择离开此页面,因为我认为 OP 对为他们的小型/临时项目提供的支持感到满意。
  • 只是添加用于上述链接定义的确切表达式: (\d[\s-]?)?[([\s-]{0,2}?\d{3} [)]\s-]{0,2}?\d{3}[\s-]?\d{4} @供记录
【解决方案2】:

使用以下正则表达式:/\(?\d{3}\)?[\s-]?\d{3}[\s-]\d{4}/

例子:

$re = '/\(?\d{3}\)?[\s-]?\d{3}[\s-]\d{4}/';
$str = 'Some address at some street (123) 456-7890 lorem itsum
Some address at some street (123) 456-7890 lorem itsum
Some address at some street (123)-456-7890 lorem itsum
Some address at some street 123 456 7890 lorem itsum
Some address at some street 123-456-7890 lorem itsum';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

【讨论】:

  • 只有代码的答案在 StackOverflow 上的价值很低。每次发布解决方案时,请始终说明您的解决方案如何工作以及为什么建议这样做。我特别担心你为什么建议 OP(和未来的研究人员)应该使用 PREG_SET_ORDER 作为函数调用中的第四个参数和 0 作为第五个参数。你知道你为什么这样做吗?它导致不必要的输出数组膨胀。请改进您的答案。
【解决方案3】:

这里我使用了 JavaScript,你可以在你的 PHP 代码中使用下面的模式。

<input type="test" id="phone" onblur="isValid(this.value)"/>

var phone = document.querySelector('#phone');

phone.onblur = function(){
    var pattern = /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$/;
  if(!pattern.test(this.value)){
      alert('In valid phone no');
      this.value = '';
  }
}

https://jsfiddle.net/83pccpuh/19/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2023-03-15
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多