【问题标题】:PHP Phone Number Replace RegexPHP电话号码替换正则表达式
【发布时间】:2012-02-28 15:52:39
【问题描述】:

我发现了一个用于从文本字符串中删除电话号码的正则表达式模式。它工作得很好,除了几个案例(这些是美国电话号码)。

这是正则表达式:

/\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x

以下是我需要捕捉的案例:

  • 55555555555(区号+7个数字)
  • 155555555555(1+区号+7个号码)
  • (555)-5555555(括号中的区号,破折号,7个数字)
  • 1-555-555-5555
  • 1-(555)-555-5555

这是我正在使用的正则表达式替换:

$pattern = "/\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x";
$replacement = "[phone redacted]";
$body = preg_replace($pattern, $replacement, $body);

【问题讨论】:

  • 你的例子当然没有涵盖人们试图绕过这个编辑方案的所有方式,所以我希望它真正代表你的数据:)
  • 是的,这很难,因为人们在文本区域中输入电话号码是不可预测的。很难说,嗯,55555555是价格,还是电话号码?
  • erg edit:但在这种情况下,我确切地知道正在编辑的文本,所以这里的匹配项应该几乎总是一个电话号码。

标签: php regex


【解决方案1】:

怎么样:

/(?:1-?)?(?:\(\d{3}\)|\d{3})[-\s.]?\d{3}[-\s.]?\d{4}/

测试:

$arr = array(
'5555555555 (area code + 7 numbers)',
'15555555555 (1 + area code + 7 numbers)',
'(555)-5555555 (area code in parenthesis, dash, 7 numbers)',
'1-555-555-5555',
'1-(555)-555-5555');

$pattern = "/(?:1-?)?(?:\(\d{3}\)|\d{3})[-\s.]?\d{3}[-\s.]?\d{4}/x";
$replacement = "[phone redacted]";
foreach($arr as $body) {
  echo preg_replace($pattern, $replacement, $body), "\n";
}

输出:

[phone redacted] (area code + 7 numbers)
[phone redacted] (1 + area code + 7 numbers)
[phone redacted] (area code in parenthesis, dash, 7 numbers)
[phone redacted]
[phone redacted]

【讨论】:

  • +1 看起来不错 - 捕获的案例比要求的多,但希望这不会是问题 :)
  • 给了这个+1,但想添加句号的使用,例如:1.555.555.5555,它越来越受欢迎。
  • @Abela:它也适用于句号和空格参见[-\s.] 除了第一个,只需将(?:1-?)? 替换为(?:1[-.]?)?
【解决方案2】:

这个应该匹配:

(1-?)?(-?\([0-9]{3}\)|[0-9]{3})(-?[0-9]{3}){2}[0-9]

【讨论】:

  • 这实际上替换了所有内容(根本没有文字)。
  • 当我有一个包含 1-555-555-5555 等的段落时,它会找到它,但也会删除所有文本。更新原始问题。
猜你喜欢
  • 2017-11-15
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2014-02-15
相关资源
最近更新 更多