这是一个我已经想出如何解决的问题,但我想用一种更简单的方法来解决它…我正在努力提高作为一个程序员。
已经做了我的研究,但未能找到一个优雅的解决以下问题:
我有一个假设的关键字数组要搜索:
$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和<已经不匹配了。>