我很难尝试突出显示格式化电话号码的搜索结果。
$(".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
。
答案 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}(?:<[^>]*>)*)/';