如何检测文本中的电话号码(并替换它们)?

时间:2010-09-21 21:56:11

标签: php string

我知道可以用坏词(检查一组预设词)来完成,但如何检测长文本中的电话号码? 我正在为一个客户建立一个PHP网站,该客户需要避免使用描述字段来设置他们的手机号码。(参见craigslist等)。

除了他需要一些节制,但我想知道是否有办法阻止至少明显像nnn-nnn-nnnn,而不是要求阻止其他奇怪的写作方式,如HeiGHT*/four*/nine等。

4 个答案:

答案 0 :(得分:6)

欢迎来到正则表达式的世界。你基本上想要使用preg_replace来查找(某些模式)并用字符串替换。

这是让你开始的事情:

$text = preg_replace('/\+?[0-9][0-9()\-\s+]{4,20}[0-9]/', '[blocked]', $text);

这样找:

  

加号(可选),后跟数字,后跟4-20个数字,括号,短划线或空格,后跟数字

并替换为字符串[blocked]。

这可以捕捉到我能想到的所有明显的组合:

012345 123123
+44 1234 123123
+44(0)123 123123
0123456789
Placename 123456 (although this one will leave 'Placename')
然而,它也会删除任何6+以上的连续数,这可能是不可取的!

答案 1 :(得分:0)

为此,您必须使用您可能知道的正则表达式。

我发现这种模式可能对您的项目有用:

<?php
  preg_match("/(^(([\+]\d{1,3})?[ \.-]?[\(]?\d{3}[\)]?)?[ \.-]?\d{3}[ \.-]?\d{4}$)/", $yourText, $matches);
  //matches variable will contain the array of matched strings
?>   

有关此模式的更多信息,请访问http://gskinner.com/RegExr/?2rirv,您甚至可以在线进行测试。这是测试正则表达式的一个很好的工具。

答案 2 :(得分:0)

如果在subject中找到pattern,则

preg_match($ pattern,$ subject)将返回1(true),否则返回0(false)。

与您提供的示例匹配的模式可能是'/ \ d {3} - \ d {3} \ d {4} /'

但是,无论您为模式选择什么,都会遭受误报和误报。

你也可以考虑在号码旁边寻找像mob,cell或tel这样的词。

可以在http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

找到php模式匹配的填充详细信息

伊恩

P.S。对于不好的话,这是不可能的,因为斯肯索普的人会告诉你。

答案 3 :(得分:0)

我认为使用过于严格的常规表达会导致大量检测失败。

您应该检查包含超过5位数的10个连续聊天的部分。

所以类似的是,由于计算权重的原因,您将在任何消息插入后排队等待调用的analisys例程。

在隔离了6位或更多位数后,根据您的喜好替换它们,包括其他的syblings数字。 在任何情况下都更好地保留原始数据,因此您可以尝试并训练您的检测算法,直到它以最佳方式工作。

然后你也可以研究你的用户数据来创建更复杂的数据,例如写成字母,混合,点分隔等的不区分大小写的数字......

这不是关于写出最完美的正则表达式,而是关于从统计上和动态上接近问题。

请记住,在您采取行动后,用户将改变他们的插入习惯,因此统计数据会发生变化,您需要学习和更新您的商品。