Php 在脚本中修改regex,通过向文本中的某些单词添加span类来突出显示它们

Php 在脚本中修改regex,通过向文本中的某些单词添加span类来突出显示它们,php,regex,Php,Regex,我正在使用正则表达式编写一个突出显示某些单词的代码 这是: function addRegEx($word){ return "/\b(\w+)?".$word."(\w+)?\b/i"; } function highlight($word){ return "<span class=\"highlighted\">".$word[0]."</span>"; } function customHighlig

我正在使用正则表达式编写一个突出显示某些单词的代码

这是:

function addRegEx($word){
        return "/\b(\w+)?".$word."(\w+)?\b/i";
    }
    function highlight($word){
        return "<span class=\"highlighted\">".$word[0]."</span>";
    }
    function customHighlights($searchString,$toHighlight){
        $searchFor = array_map('addRegEx',$toHighlight);
        $result = preg_replace_callback($searchFor,'highlight',$searchString);
        return $result;
    }
函数addRegEx($word){
返回“/\b(\w+)”.$word.(\w+)?\b/i”;
}
功能突出显示($word){
返回“$word[0]”;
}
函数customHighlights($searchString,$toHighlight){
$searchFor=array_map('addRegEx',$toHighlight);
$result=preg_replace_回调($searchFor,'highlight',$searchString);
返回$result;
}
假设我使用函数customHighlights搜索特定文本中的单词“car”

使用boundary-\b-方法,脚本在文本中搜索单词car

在正则表达式中,我在单词前后添加了(\w+),因此脚本将匹配包含“car”-cars、sportcars等的单词

问题是,它会弄乱内部html,例如:

This is a great car. Click here for <a href="http://cars.com">more</a>
这是一辆很棒的车。点击此处查看
脚本将匹配上面链接url中的单词car,向其中添加跨类并弄乱html。


<>你如何修改正则表达式并避免这个问题?

< P>你是否考虑使用JavaScript处理客户端的文本高亮显示?jQuery或类似工具可以让您在节点上进行迭代,找到突出显示的位置,而不是使用原始HTML。
不过,正则表达式帮不了你什么忙。

使用正则表达式在最后一个
或文本开头之后搜索单词,但这和单词之间的部分可能不包含标记start

输出

string(141) "This is a great <span class="highlighted">car</span>. Click here for <a href="http://cars.com">more <span class="highlighted">cars</span></a>"
string(141)“这是一辆很棒的车。单击此处查看”

我使用highlight函数只是为了摘录——也许我可以保持它的简单性,并将它应用到摘录中没有链接的部分。这个问题很难解决,特别是如果你想考虑到每个HTML标记的话。你想考虑每个标签还是只考虑
a
标签?在我的摘录中,我有一个H3标签和p标签,所以它们不会断裂,因为它们不能包含单词car。除此之外,还有一个url可以包含这个词,所以我可以忽略它并解决这个问题。这是一个很好的解决方法-如果一切都失败了,我会实现它,只是我让这个词突出显示服务器端。我必须将它们回显到一个javascript数据对象中,然后从那里开始工作
string(141) "This is a great <span class="highlighted">car</span>. Click here for <a href="http://cars.com">more <span class="highlighted">cars</span></a>"