PHP:字符串中重叠关键字的粗体

时间:2011-09-23 22:23:44

标签: php regex

这是一个我已经想出如何解决的问题,但我想以更简单的方式解决它......我正在努力改进程序员。

完成了我的研究,未能找到针对以下问题的优雅解决方案:

我有一系列假设的搜索关键字:

$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?"

因为当它中间有一个粗体标记时,它不会识别“石南花”。

我希望最终解决方案尽可能简单地返回以下两个字符串中的一个:

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

一些最终条件:

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

- 我希望它能够处理以下两种情况(线代表重叠的字符串):

一个字符串吞噬另一个字符串,如下面的两个例子:

- 他,希瑟

- 打磨,

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

- 带走,训练

可能的解决方法:

- 忽略关键字中标签的正则表达式

- 长路(我想避免):

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

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

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

非常感谢提前!

3 个答案:

答案 0 :(得分:1)

Example

$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>?

答案 1 :(得分:0)

简单而懒惰的方法脱离我的头脑:

按项目长度对初始数组进行排序,降序!不再“因为中间已有标签而无法识别”!

编辑:然后通过以&gt; foo和foo&lt;的方式扩展你的正则表达式来轻松修复嵌套标签问题。不再匹配了。

答案 2 :(得分:0)

需要更改正则表达式模式以识别您要搜索的每个“术语”后面都是空格或标点符号,因此它不会将模式匹配应用于后跟字母数字的项目。