[英]Replacing words with tag links in PHP
我有一個文本( $text
)和一個單詞數組( $tags
)。 文本中的這些單詞應該替換為指向其他頁面的鏈接,這樣它們就不會破壞文本中的現有鏈接。 在CakePHP中,TextHelper中有一個方法可以執行此操作,但它已損壞,並且會破壞文本中現有的HTML鏈接。 該方法假設像這樣工作:
$text=Text->highlight($text,$tags,'<a href="/tags/\1">\1</a>',1);
下面是CakePHP TextHelper中的現有代碼:
function highlight($text, $phrase, $highlighter = '<span class="highlight">\1</span>', $considerHtml = false) {
if (empty($phrase)) {
return $text;
}
if (is_array($phrase)) {
$replace = array();
$with = array();
foreach ($phrase as $key => $value) {
$key = $value;
$value = $highlighter;
$key = '(' . $key . ')';
if ($considerHtml) {
$key = '(?![^<]+>)' . $key . '(?![^<]+>)';
}
$replace[] = '|' . $key . '|ix';
$with[] = empty($value) ? $highlighter : $value;
}
return preg_replace($replace, $with, $text);
} else {
$phrase = '(' . $phrase . ')';
if ($considerHtml) {
$phrase = '(?![^<]+>)' . $phrase . '(?![^<]+>)';
}
return preg_replace('|'.$phrase.'|i', $highlighter, $text);
}
}
您可以在此處查看(並運行)此算法:
http://www.exorithm.com/algorithm/view/highlight
只需進行一些更改,它就可以變得更好更簡單,但它仍然不完美。 雖然效率較低,但我推薦一款Ben Doom的解決方案。
替換HTML中的文本與替換純文本根本不同。 要確定文本是否是HTML標記的一部分,您需要查找所有標記以便不考慮它們。 正則表達式並不是真正的工具。
我會嘗試以下解決方案之一:
我認為第一個可能更高效,但更容易出現程序員錯誤,所以我會留給你。
如果您想知道我為什么不直接解決這個問題,請查看網站上有關正則表達式和HTML的所有問題,以及正則表達式如何不是解析器。
這段代碼工作得很好。 您可能需要做的是檢查CSS的<span class="highlight">
並確保將其設置為某種顏色,以便您區分它是高亮的。
.highlight { background-color: #FFE900; }
非晶 - 我注意到格特編輯了你的帖子。 這兩個代碼片段與發布的完全一樣嗎?
因此,即使原始代碼是為突出顯示而設計的,但我知道您正在嘗試將其重新用於生成鏈接 - 它應該,並且確實可以正常工作(按發布測試)。
然而 ,在第一個代碼片段中轉義可能是一個問題。
$text=Text->highlight($text,$tags,'<a href="/tags/\1">\1</a>',1);
工作得很好......但如果你使用說話標記而不是引號,則反斜杠會作為逃避標記消失 - 你需要逃脫它們。 如果你不這樣做,你會得到%01鏈接。
講話標記的正確方法是:
$text=Text->highlight($text,$tags,"<a href=\"/tags/\\1\">\\1</a>",1);
(注意使用\\ 1而不是\\ 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.