我有一个网站分类列表的文字说明字段。有一个单独的字段用于输入电话号码以联系此人,但很多人正在说明中进入电话,这是我不想要的。
如果以数字格式输入,我会使用正则表达式对其进行过滤,但它们会非常有创意并且也会使用字母。有没有办法使用正则表达式或字段的某种预处理来过滤它。
以下是一个示例代码(仅适用于手机号码):
$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可以不贪婪并在找到第一个匹配时停止,然后处理其余的字符串以进行其他匹配吗?