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

时间:2017-06-08 18:43:19

标签: php regex preg-replace

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

$(".dateTimePicker").datetimepicker({
    step: 15 
});

我正在尝试使用突出显示的字符串:

$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); 可能是任何东西。 “7890”有效,“456-7890”有效,但“5678”由于$search_txt中的“ - ”而无效。

我也尝试剥离$phone_number的格式(即“1234567890”),但如果他们输入字母“56-78”,我也有同样的问题。

如果我同时删除$phone_number(“1234567890”)和$phone_number(“5678”),则突出显示会起作用并返回$search_txt,但我不知道如何重新启动使用字符串中的高亮代码引入格式。

最终字符串必须是电话号码格式“(123)456-7890”,并突出显示HTML。

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

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

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

选项#2:我可以在匹配时忽略(123) 4<span style="background-color:#ff0;">56-78</span>90中的字母字符,但是将它们包含在替换后的字符串中吗?

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

并返回$phone_number

1 个答案:

答案 0 :(得分: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<span>56-78</span>90

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

如果HTML标记中必须包含数字,则必须使用&lt; [^&gt;] *&gt;等替换\ D.

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

(?:...)构造对项目​​进行分组而不捕获它们。使用{}结构添加一些优雅,你有:

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