php - preg_replace 突出显示格式化的 phone 数字

php - preg_replace to highlight formatted phone numbers

我很难尝试突出显示格式化 phone 号码的搜索结果。

$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”),突出显示和 returns 1234<span style="background-color:#ff0;">5678</span>90 有效,但我不'知道如何用字符串中的高亮代码重新引入格式。

最后的字符串需要是 phone 数字格式“(123) 456-7890”,其中包含突出显示 HTML。

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

1234<span style="background-color:#ff0;">5678</span>90

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

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

即“5678”将匹配“(123) 456-7890”

和return (123) 4<span style="background-color:#ff0;">56-78</span>90.

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

$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 = '() -'; echo "\n\n".preg_replace($pattern, $replace, $phone);

产生:

(123) 4<span>56-78</span>90

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

如果您的 HTML 标签中必须有数字,那么您必须将 \D 替换为类似 <[^>]*> 的内容。

$pattern = '/((?:<[^>]*>)*\d(?:<[^>]*>)*\d(?:<[^>]*>)*\d)...

(?:...) 结构在不捕获项目的情况下对项目进行分组。使用 {} 构造来增加一点优雅,您有:

$pattern = '/((?:(?:<[^>]*>)*\d){3})((?:(?:<[^>]*>)*\d){3})((?:(?:<[^>]*>)*\d){4}(?:<[^>]*>)*)/';