簡體   English   中英

用PHP替換帶標記鏈接的單詞

[英]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.

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