使用正则表达式禁止文本中的电话号码(使用字母而不是数字)?

时间:2014-09-15 07:14:33

标签: php regex phone-number

我有一个网站分类列表的文字说明字段。有一个单独的字段用于输入电话号码以联系此人,但很多人正在说明中进入电话,这是我不想要的。

如果以数字格式输入,我会使用正则表达式对其进行过滤,但它们会非常有创意并且也会使用字母。有没有办法使用正则表达式或字段的某种预处理来过滤它。

以下是一个示例代码(仅适用于手机号码):

$phone = '0888123123';
$text  = 'Some description with phone set to 0888123123 as well as zero eight eight eight one two three one two three.';

preg_match_all('/('.implode('[\D]*', str_split($phone)).')/i', strip_tags($text), $matches);

if (count($matches) > 0) {
   foreach($matches as $value) {
      $text = str_replace($value, $phone, $text);
   }
}

我正在考虑用像array('one'=>1)这样的数组中的数字替换每个字母,它会起作用,除非它们在文本中的其他地方有一个数字,它也会替换它。有没有办法升级正则表达式以捕获该电话号码的字母大小写?

编辑:

我用字母格式的数字更新了正则表达式,但还有另一个问题。如果电话号码在文本中出现多次,则无法正常工作:

$text  = 'Some description with phone set to 0888123123 as well as zero eight eight eight one two three one two three and a second time - zero eight eight eight one two three one two three.';

$phone_digits   = array(0=>'zero',
                                1=>'one',
                                2=>'two',
                                3=>'three',
                                4=>'four',
                                5=>'five',
                                6=>'six',
                                7=>'seven',
                                8=>'eight',
                                9=>'nine');
$phone_letters = array();
foreach (str_split($phone) as $number)
{
   $phone_letters[] = "($number|$phone_digits[$number])";
}
preg_match_all('/('.implode('[\D]*', $phone_letters).')/i', $text, $matches);

它匹配字母,但不会停在手机的最后一个号码:

匹配:"零八八八一二三一二三和第二时间 - 零八八八一二三一二三。"

而不是匹配两次:

"零八八八一二三一二三"

preg_match可以不贪婪并在找到第一个匹配时停止,然后处理其余的字符串以进行其他匹配吗?

0 个答案:

没有答案