[英]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>?"
一些最終條件:
-我希望最終的解決方案能夠處理大量可能的關鍵字
-我希望處理以下兩種情況(線條代表重疊的字符串):
一個字符串吞沒了另一個字符串,如以下兩個示例所示:
-他,希瑟
-打磨
或一個字符串沒有吞沒另一個字符串:
-訓練
解決的可能方法:
-忽略關鍵字標簽的正則表達式
-長途(我想避免):
*搜索字符串以查找每個關鍵字的所有出現次數,並存儲要加粗的關鍵字的位置數組(開始和結束)
*以遞歸方式處理此數組以合並重疊的關鍵字,因此沒有冗余
*添加粗體標簽(從字符串的末尾開始,以避免信息的位置從其他字符轉移)
提前謝謝了!
$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>?
簡單而懶惰的方法脫穎而出:
按項目長度對初始數組進行排序,降序排列! 不再出現“由於中間已經有標簽而無法識別”的問題!
編輯:嵌套標簽的問題可以通過> foo和foo <不再匹配的方式擴展正則表達式來輕松解決。
需要更改您的正則表達式模式以識別要搜索的每個“術語”后跟空格或標點符號,以便它不會將模式匹配應用於后跟字母數字的項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.