正则表达式从字符串中获取电话号码

时间:2018-03-12 15:45:11

标签: php regex

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

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...

3 个答案:

答案 0 :(得分:1)

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

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

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

请注意,正则表达式匹配的内容超出了您列出的格式,但由于我没有美国公民,我认为它是预期的。

Here这是一个regex101示例,显示一旦删除了锚点,它就会按预期工作。

答案 1 :(得分:0)

使用以下正则表达式:/\(?\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);

答案 2 :(得分:-1)

这里我使用了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/