PHP:如何从字符串中删除电话号码


Php: how to remove phone numbers from string?

我正在尝试从我的市场网站用户之间的消息中删除/检测电话号码(想想eBay做了类似的事情)这是我正在使用的代码:

$string = preg_replace('/([0-9]+['- ]?[0-9]+)/', '', $string);

但。。。它太激进了,它确实剥离了带有 2 个或更多数字的任何数字......如何设置7个数字的限制?

更准确地说,电话号码可以是任何格式,例如

3747657654
374-7657654
374-765-7654
(374)765-7654
etc...(i cannot predict what the users will write depending of their habits)

试试这个正则表达式:

/([0-9]+['- ]?[0-9]{6,})/

更改以匹配您的样品:正则表达式101

这取决于确切的要求,因为现在您有 1 个或多个数字后跟一个可选的-或空格,后跟 1 个或多个数字。

例如,如果您想在空格或-之前至少 2 个数字,后跟至少 5 个数字,您可以使用如下内容:

$string = preg_replace('/([0-9]{2,}['- ]?[0-9]{5,})/', '', $string);
                                              ^^^^ Here you can specify mininimum / maximum
                               ^^^^ Here you can specify mininimum / maximum

你可以尝试这样的事情:

$string = preg_replace('/(?<![0-9]|[0-9]-)[0-9](?:[- ]?[0-9]){6}(?!-?[0-9])/', '', $string);

此处的查找是为了避免超过 7 位数字的数字,但如果您想要更具体的内容,则应提供一个示例字符串。

如果没有某种上下文智能发生,就无法确定 X 位数字的数量(其中 X 是有效的电话号码长度)是电话号码还是其他东西。一个简单的正则表达式无法确定"在3453456打电话给我""当你飞了3453456英里时给我打电话"之间的区别。

因此,尝试使用正则表达式在没有任何格式(只是直数字)的情况下捕获电话号码是无望的、纯粹而简单的。尝试这样做只会阻止您找到可以找到格式化/半格式化数字的正则表达式。你应该在这里做的是"以最小的误报获得显而易见的和尽可能多的其他......但要认识到我不能全部得到它们。

为此,我建议这样做:

/1?[ '-]?'(?([0-9]{3})?')?[ '-]?([0-9]{3})[ '-]([0-9]{4})/g

它不应该得到前三个,但得到这个列表中所有的其余部分:

no-match: 3747657654
no-match: 444444444444444
no-match: 7657654
match:    374-765-7654
match:    1-374-765-7654
match:    (374)765-7654
match:    (374) 765 7654
match:    765-7654
match:    1 (374) 765 7654
match:    1(374)765 7654