这是一个我已经想出如何解决的问题,但我想以更简单的方式解决它......我正在努力改进程序员。
完成了我的研究,未能找到针对以下问题的优雅解决方案:
我有一系列假设的搜索关键字:
$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>?"
一些最终条件:
- 我希望最终解决方案能够处理大量可能的关键字
- 我希望它能够处理以下两种情况(线代表重叠的字符串):
一个字符串吞噬另一个字符串,如下面的两个例子:
- 他,希瑟
- 打磨,
或者一个字符串不吞没另一个字符串:
- 带走,训练
可能的解决方法:
- 忽略关键字中标签的正则表达式
- 长路(我想避免):
*搜索每个关键字出现的字符串,存储要加粗的关键字的位置数组(开始和结束)
*递归处理此数组以组合重叠关键字,因此没有冗余
*添加粗体标签(从字符串末尾开始,以避免信息从其他字符移位)
非常感谢提前!
答案 0 :(得分:1)
$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)
需要更改正则表达式模式以识别您要搜索的每个“术语”后面都是空格或标点符号,因此它不会将模式匹配应用于后跟字母数字的项目。