2013-07-18 44 views
2

我有這個文本ijhhhv&yuy&uvuv&,我想突出顯示「&」字符。正則表達式並替換給予&而不是&

當我運行這段代碼:

var searchTerm = '&'; 
var searchTermRegEx = new RegExp(searchTerm, "g"); 
var content = "<span class='match'>" + searchTerm + "</span>"; 
$('#div').html($('#div').html().replace(searchTermRegEx,content)); 

我得到這樣的:ijhhhv&amp;yuy&amp;uvuv&amp; - 一個額外的 「放大器」;在我高調列出的「&」之後,爲什麼?如何解決這個問題?
(搜索詞不只是「&」,我會用文字和字母在我的正則表達式搜索。我剛剛與「&」的問題)

小提琴here

+0

您的源代碼HTML是'ijhhhv&yuy&uvuv&',但那是無效的HTML。在HTML文本中,&符號必須被轉義,例如'ijhhhv & yuy & uvuv &''。然而,解決這個問題並不能解決你的問題,這只是一個問題。 –

+0

這不是取代,我錯了嗎? –

+0

@LightStyle:你說得對。使用'&&'只會使它完全取代,而不會改變內容。 – Guffa

回答

4

使用.text()代替.html(),因爲最後一個將特殊字符轉換爲有效的HTML實體。

var searchTermRegEx = /&/g, //you can use short form 
    content = "<span class='match'>&</span>", 
    replaced = $('#div').text().replace(searchTermRegEx, content); 
$('#div').html(replaced); 

您的腳本以這種方式工作:

$('#div').html() // here it is ijhhhv&amp;yuy&amp;uvuv&amp; 
     .replace(searchTermRegEx, content); //here it becomes ijhhhv<span class='match'>&</span>amp;yuy<span class='match'>&</span>amp;uvuv<span class='match'>&</span>amp; 

如果使用.text()&不會被編碼,因此該函數將返回正確的(未編碼)的文本,將與跨度更換,如你所願。

+1

你說得對。它效果很好。我只需要幾分鐘的時間來閱讀所有的答案,並從你們身上學習:) – Rikard

+1

這適用於純文本和'&'作爲唯一的HTML實體。如果有任何HTML元素或其他HTML實體,它們將丟失或損壞。 – Guffa

0

搜索條件需要編碼。

var searchTerm = '&amp'; 
var searchTermRegEx = new RegExp(searchTerm, "g"); 
var content = "<span class='match'>" + searchTerm + "</span>"; 
$('#div').html($('#div').html().replace(searchTermRegEx,content)); 
1

這是因爲該字符串中的字符&是HTML編碼,因此字符串包含&amp;每個&字符。當你做替換時,你用<span class='match'>&</span>amp;替換&amp;,所以添加span標籤會中斷HTML實體。

如果你想突出&字符,你需要替換HTML實體&amp;

var searchTerm = '&amp;'; 
+0

+1說明。謝謝! – Rikard

1

只是split the code into steps看到爲什麼發生這種情況。

var oldHtml = $('#div').html() 

oldHtml現在ijhhhv&amp;yuy&amp;uvuv&amp;。由於你沒有正確的HTML轉義你的&,所以jQuery將它們轉移到&amp;實體中。

var newHtml = oldHtml.replace(searchTermRegEx,content); 

newHtml現在ijhhhv<span class='match'>&</span>amp;yuy<span class='match'>&</span>amp;uvuv<span class='match'>&</span>amp;。正如你所看到的,你從&amp;字符實體的其餘部分分割出&

$('#div').html(newHtml); 

在寫入HTML之前,jQuery修復了任何錯誤的轉義。所以它寫的HTML最終將會是ijhhhv<span class='match'>&amp;</span>amp;yuy<span class='match'>&amp;</span>amp;uvuv<span class='match'>&amp;</span>amp;。正如你所看到的,匹配內的&符號已經正確地逃脫了,但角色實體的剔除剩餘物仍然存在。

One way to fix this將改變您正在搜索的內容。由於您在HTML內部進行匹配,而不是在文本內部進行匹配,所以您應該HTML轉義您正在搜索的內容。

var searchTerm = '&amp;'; 
+0

+1有很好的解釋。謝謝! – Rikard