php - preg_replace 突出显示格式化的电话号码

Posted

技术标签:

【中文标题】php - preg_replace 突出显示格式化的电话号码【英文标题】:php - preg_replace to highlight formatted phone numbers 【发布时间】:2017-06-08 18:43:18 【问题描述】:

我很难突出显示格式化电话号码的搜索结果。

$search_txt='5678'; // user generated (can be anything)
$phone_number='(123) 456-7890'; // always in this format

我正在尝试这个来获得突出显示的字符串:

$highlighted = preg_replace('#'. preg_quote($search_txt) .'#i', '<span style="background-color:#ff0;">\\0</span>', $phone_number);

$search_txt 可以是任何东西。 “7890”有效,“456-7890”有效,但由于$phone_number 中的“-”,“5678”无效。

我也尝试过去除$phone_number 的格式(即“1234567890”),但如果他们输入字母字符“56-78”,我也会遇到同样的问题。

如果我同时剥离 $phone_number ("1234567890") 和 $search_txt ("5678"),突出显示有效并返回 1234&lt;span style="background-color:#ff0;"&gt;5678&lt;/span&gt;90,但我不知道如何重新引入带有突出显示的格式字符串中的代码。

最后的字符串必须是电话号码格式“(123) 456-7890”,并包含突出显示的 html

选项 #1:我可以格式化电话号码同时忽略号码中的 HTML 标记吗?

1234&lt;span style="background-color:#ff0;"&gt;5678&lt;/span&gt;90

变成(123) 4&lt;span style="background-color:#ff0;"&gt;56-78&lt;/span&gt;90

选项 #2:我可以在匹配时忽略 $phone_number 中的字母字符,但将它们包含在替换的字符串中吗?

即"5678" 将匹配 "(123) 456-7890"

并返回(123) 4&lt;span style="background-color:#ff0;"&gt;56-78&lt;/span&gt;90

【问题讨论】:

将数字以其原始格式保存在一个变量中,然后在另一个变量中去除破折号。进行比较并将原始数字作为突出显示的数字返回。 我还试图在格式化数字中突出显示搜索词(“56-78”)(当他们搜索“5678”时)。原文需要部分突出显示(不是整个字符串)。 【参考方案1】:

假设您的标签没有数值作为一个明确的例子:

$phone = "1234<span>5678</span>90"; $pattern = '/(\D*\d\D*\d\D*\d)(\D*\d\D*\d\D*\d)(\D*\d\D*\d\D*\d\D*\d\D*)/'; $replace = '($1) $2-$3'; echo "\n\n".preg_replace($pattern, $replace, $phone);

产生:

(123) 4&lt;span&gt;56-78&lt;/span&gt;90

基本上,我在每个数字之前和最后一个数字之后捕获零个或多个非数字值。这假设您已将搜索字符串和目标电话号码都简化为简单的数字字符串(“4567”和“1234567890”),然后执行搜索和替换以放置 HTML 标记。

如果您的 HTML 标记中必须包含数字,则必须将 \D 替换为 ]*> 之类的内容。

$pattern = '/((?:&lt;[^&gt;]*&gt;)*\d(?:&lt;[^&gt;]*&gt;)*\d(?:&lt;[^&gt;]*&gt;)*\d)...

(?:...) 构造对项目​​进行分组而不捕获它们。使用 构造增加一点优雅,您就拥有了:

$pattern = '/((?:(?:&lt;[^&gt;]*&gt;)*\d)3)((?:(?:&lt;[^&gt;]*&gt;)*\d)3)((?:(?:&lt;[^&gt;]*&gt;)*\d)4(?:&lt;[^&gt;]*&gt;)*)/';

【讨论】:

关于$replace 的注释。我的结果中得到了\(123\),所以我删除了斜线。 $replace = '($1) $2-$3'; - 感谢您的帮助。 呃。谢谢牧师。有时你只是看不到森林的树木。我改了帖子。 这太不可思议了,谢谢!为我的项目将其转换为 JS,并且运行良好。

以上是关于php - preg_replace 突出显示格式化的电话号码的主要内容,如果未能解决你的问题,请参考以下文章

警告:preg_replace():未知修饰符“h”

格式PHP Var Export

php实现转换html格式为文本格式的方法

PHP7 preg_replace出错及解决办法

PyCharm - 社区版是不是能够突出显示 php?

在php的菜单中突出显示当前页面