如何在php中突出显示字符串的匹配部分

如何在php中突出显示字符串的匹配部分,php,regex,preg-replace,highlighting,Php,Regex,Preg Replace,Highlighting,这是我目前在php中使用的函数: function highlight_keywords($keyword, $string) { return preg_replace("/\p{L}*?".preg_quote($keyword)."\p{L}*/ui", "<span class=\"h\">$0</span>", $string); } 例如: echo highlight_keywords('anto', 'Andres Santos'); 问题是结

这是我目前在php中使用的函数:

function highlight_keywords($keyword, $string) {
    return preg_replace("/\p{L}*?".preg_quote($keyword)."\p{L}*/ui", "<span class=\"h\">$0</span>", $string);
}
例如:

echo highlight_keywords('anto', 'Andres Santos');
问题是结果是:

Andres <span class="h">Santos</span>
安德烈斯桑托斯 ……应该是:

Andres S<span class="h">anto</span>s
安德烈斯桑托斯 使用捕获组:

function highlight_keywords($keyword, $string) {
    return preg_replace("/(\p{L}*?)(".preg_quote($keyword).")(\p{L}*)/ui", "$1<span class=\"h\">$2</span>$3", $string);
}
函数突出显示\u关键字($keyword,$string){
返回preg_replace(“/(\p{L}*?)(“.preg_quote($keyword)。”)(\p{L}*)/ui“,“$1$2$3”,$string);
}
使用捕获组:

function highlight_keywords($keyword, $string) {
    return preg_replace("/(\p{L}*?)(".preg_quote($keyword).")(\p{L}*)/ui", "$1<span class=\"h\">$2</span>$3", $string);
}
函数突出显示\u关键字($keyword,$string){
返回preg_replace(“/(\p{L}*?)(“.preg_quote($keyword)。”)(\p{L}*)/ui“,“$1$2$3”,$string);
}

我同意@chris85的评论。您没有理由为此任务使用正则表达式

只需用标记包装的文本字符串替换文本字符串

return str_replace($keyword, '<span class="h">' . $keyword . '</span>', $string);
关于您对特殊角色的关注,我们敬爱的@deceze:

请注意,所有关于mb_str_的讨论都将在 评论是毫无意义的。str_replace可以很好地用于 多字节字符串


我同意@chris85的评论。您没有理由为此任务使用正则表达式

只需用标记包装的文本字符串替换文本字符串

return str_replace($keyword, '<span class="h">' . $keyword . '</span>', $string);
关于您对特殊角色的关注,我们敬爱的@deceze:

请注意,所有关于mb_str_的讨论都将在 评论是毫无意义的。str_replace可以很好地用于 多字节字符串


为什么您有\p{L}*?部分模式?为什么不直接返回preg\u replace(“/”.preg\u quote($keyword)。“/ui”、“$0”、$string)@BrandonHorsley你说得对。您的答案甚至比下面的第一个响应更简单。不需要使用正则表达式来匹配静态值。使用
返回str_replace($keyword、.$keyword.'、$string)
@chris85是正确的,如果您需要不区分大小写的话,str_-ireplace。我可能错了,但是str_-replace在返回特殊字符时并不总是很好。为什么您有\p{L}*?部分模式?为什么不直接返回preg\u replace(“/”.preg\u quote($keyword)。“/ui”、“$0”、$string)@BrandonHorsley你说得对。您的答案甚至比下面的第一个响应更简单。不需要使用正则表达式来匹配静态值。使用
返回str_replace($keyword、.$keyword.'、$string)@chris85是正确的,如果需要不区分大小写,str_-ireplace。我可能错了,但是str_-replace在返回特殊字符时并不总是很好。