为了账号安全,请及时绑定邮箱和手机立即绑定

使用 preg_replace 检测电话号码和一些细节

使用 preg_replace 检测电话号码和一些细节

PHP
米琪卡哇伊 2021-11-13 19:18:10
这是一个基本的 preg_replace 检测电话号码(和长号码)。我的问题是我想避免检测双斜杠""、单''斜杠和正斜杠之间的数字//$text = preg_replace("/(\+?[\d-\(\)\s]{8,25}[0-9]?\d)/", "<strong>$1</strong>", $text);我四处探查,但没有什么对我有用。您的帮助将不胜感激。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

似乎您没有在验证,那么您可能正在尝试编写一些边界较少的表达式,例如:

^\+?[0-9()\s-]{8,25}[0-9]$

如果你想简化/修改/探索表达式,它已经在regex101.com 的右上角面板中进行了解释。如果您愿意,您还可以在此链接中观看它如何与某些示例输入匹配。


查看完整回答
反对 回复 2021-11-13
?
米脂

TA贡献1836条经验 获得超3个赞

我预测您的模式会让您失望而不是让您满意(或者您对项目范围内的“过度匹配”感到非常满意)。


虽然我的建议确实超出了模式长度,但(*SKIP)(*FAIL)通过消耗和丢弃需要取消资格的子字符串,一种技术可以很好地为您服务。可能有一种方法可以通过环视来指示模式逻辑,但是由于初始模式中有如此多的潜在漏洞且没有样本数据,因此变量太多,无法提出自信的建议。


代码:


$text = <<<TEXT

A number 555555555 then some more text and a quoted number "(123)4567890" and

then 1 2 3 4     6 (54) 3 -2 and forward slashed /+--------0/ versus

+--------0 then something more realistic '234 588 9191' no more text.

This is not closed by the same character on both

ends: "+012345678901/ which of course is a _necessary_ check?

TEXT;


echo preg_replace(

         '~([\'"/])\+?[\d()\s-]{8,25}\d{1,2}\1(*SKIP)(*FAIL)|((?!\s)\+?[\d()\s-]{8,25}\d{1,2})~',

         "<strong>$2</strong>",

         $text);

输出:


A number <strong>555555555</strong> then some more text and a quoted number "(123)4567890" and

then <strong>1 2 3 4     6 (54) 3 -2</strong> and forward slashed /+--------0/ versus 

<strong>+--------0</strong> then something more realistic '234 588 9191' no more text.

This is not closed by the same character on both

ends: "<strong>+012345678901</strong>/ which of course is a _necessary_ check?

有关技术细分,请参阅 Regex101 链接。


否则,这是有效地检查“电话号码”(由最初的模式),如果它们被包裹',"或/则匹配被忽略,正则表达式引擎继续寻找那个子后的比赛。我(?!\s)在您的电话模式的第二次使用开始时添加了,以便在替换时省略前导空格。


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信