簡體   English   中英

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

一些最終條件:

-我希望最終的解決方案能夠處理大量可能的關鍵字

-我希望處理以下兩種情況(線條代表重疊的字符串):

一個字符串吞沒了另一個字符串,如以下兩個示例所示:

-他,希瑟

-打磨

或一個字符串沒有吞沒另一個字符串:

-訓練

解決的可能方法:

-忽略關鍵字標簽的正則表達式

-長途(我想避免):

*搜索字符串以查找每個關鍵字的所有出現次數,並存儲要加粗的關鍵字的位置數組(開始和結束)

*以遞歸方式處理此數組以合並重疊的關鍵字,因此沒有冗余

*添加粗體標簽(從字符串的末尾開始,以避免信息的位置從其他字符轉移)

提前謝謝了!

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM