PHP:在字符串中保留重叠的关键字


PHP: Bolding of overlapping keywords in string

这是一个我已经想出如何解决的问题,但我想用一种更简单的方法来解决它…我正在努力提高作为一个程序员。

已经做了我的研究,但未能找到一个优雅的解决以下问题:

我有一个假设的关键字数组要搜索:

$keyword_array = array('he','heather');

和一个假设的字符串:

$text = "What did he say to heather?";

最后是一个假设函数:

function bold_keywords($text, $keyword_array)
{
    $pattern = array();
    $replace = array();
    foreach($keyword_array as $keyword)
    {
        $pattern[] = "/($keyword)/is";
        $replace[] = "<b>$1</b>";
    }
    $text = preg_replace($pattern, $replace, $text);
    return $text;
}

函数(不太奇怪)返回如下内容:

"What did <b>he</b> say to <b>he</b>ather?"

因为当中间有一个粗体标签时,它无法识别"heather"

我想要的最终解决方案是,尽可能简单地返回以下两个字符串之一:

"What did <b>he</b> say to <b>heather</b>?"
"What did <b>he</b> say to <b><b>he</b>ather</b>?"

一些最终条件:

——我希望最终的解决方案能够处理大量可能的关键字

——我希望它能处理以下两种情况(行表示重叠的字符串):

一个字符串包含另一个字符串,如以下两个示例:

——he, heather

—sanding,和

或者一个字符串没有吞没另一个字符串:

——entrain, training

可能的解决方法:

-A regex忽略关键字

中的标签

很长的路(我试图避免):

*搜索每个关键字的所有出现的字符串,存储一个数组的位置(开始和结束)的关键字要保留

*递归地处理这个数组以组合重叠的关键字,因此没有冗余

*添加粗体标签(从字符串的末尾开始,以避免信息的位置从附加字符移动)

提前感谢!

示例

$keyword_array = array('he','heather');
$text = "What did he say to heather?";
$pattern = array();
$replace = array();
sort($keyword_array, SORT_NUMERIC);
foreach($keyword_array as $keyword)
{
    $pattern[] = "/ ($keyword)/is";
    $replace[] = " <b>$1</b>";
}
$text = preg_replace($pattern, $replace, $text);
echo $text; // What did <b>he</b> say to <b>heather</b>?

需要更改您的regex模式,以识别您正在搜索的每个"术语"后面都有空格或标点符号,以便它不会将模式匹配应用于后面跟着字母数字的项目。

过于简单和懒惰的方法:

按项目长度降序排序初始数组!再也不会出现"因为中间已经有标签而无法识别"的问题了!

编辑:嵌套的标签问题很容易通过扩展你的正则表达式在>foo和<已经不匹配了。>