猿问

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

这是一个基本的 preg_replace 检测电话号码(和长号码)。我的问题是我想避免检测双斜杠""、单''斜杠和正斜杠之间的数字//

$text = preg_replace("/(\+?[\d-\(\)\s]{8,25}[0-9]?\d)/", "<strong>$1</strong>", $text);

我四处探查,但没有什么对我有用。您的帮助将不胜感激。


米琪卡哇伊
浏览 170回答 2
2回答

智慧大石

似乎您没有在验证,那么您可能正在尝试编写一些边界较少的表达式,例如:^\+?[0-9()\s-]{8,25}[0-9]$如果你想简化/修改/探索表达式,它已经在regex101.com 的右上角面板中进行了解释。如果您愿意,您还可以在此链接中观看它如何与某些示例输入匹配。

米脂

我预测您的模式会让您失望而不是让您满意(或者您对项目范围内的“过度匹配”感到非常满意)。虽然我的建议确实超出了模式长度,但(*SKIP)(*FAIL)通过消耗和丢弃需要取消资格的子字符串,一种技术可以很好地为您服务。可能有一种方法可以通过环视来指示模式逻辑,但是由于初始模式中有如此多的潜在漏洞且没有样本数据,因此变量太多,无法提出自信的建议。代码:$text = <<<TEXTA number 555555555 then some more text and a quoted number "(123)4567890" andthen 1 2 3 4&nbsp; &nbsp; &nbsp;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 bothends: "+012345678901/ which of course is a _necessary_ check?TEXT;echo preg_replace(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'~([\'"/])\+?[\d()\s-]{8,25}\d{1,2}\1(*SKIP)(*FAIL)|((?!\s)\+?[\d()\s-]{8,25}\d{1,2})~',&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"<strong>$2</strong>",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$text);输出:A number <strong>555555555</strong> then some more text and a quoted number "(123)4567890" andthen <strong>1 2 3 4&nbsp; &nbsp; &nbsp;6 (54) 3 -2</strong> and forward slashed /+--------0/ versus&nbsp;<strong>+--------0</strong> then something more realistic '234 588 9191' no more text.This is not closed by the same character on bothends: "<strong>+012345678901</strong>/ which of course is a _necessary_ check?有关技术细分,请参阅 Regex101 链接。否则,这是有效地检查“电话号码”(由最初的模式),如果它们被包裹',"或/则匹配被忽略,正则表达式引擎继续寻找那个子后的比赛。我(?!\s)在您的电话模式的第二次使用开始时添加了,以便在替换时省略前导空格。
随时随地看视频慕课网APP
我要回答