2013-10-09 50 views
1

高亮關鍵字我在JavaScript中的字符串:在一個HTML字符串

str='asdf <a href="http://asdf.com">asdfasdfasdf</a> <span class="asdf">asdf</span>'; 

我怎樣才能讓每一個「A」的文本加粗不改變HTML標記?

我想做的事:

str = str.replace("a","<b>a</b>"); 

STR應該等於:

"<b>a</b>sdf <a href='http://asdf.com'><b>a</b>sdf......" 
+0

你將不能夠做到這一點不改變的標記。 – Lix

+0

使用DOM遍歷所有文本節點,並在那裏替換。 –

回答

1

的正則表達式是

/searchString(?=[^<>]*(<|$))/g 

例如:

> str="asdf <a href='http://asdf.com'>asdfasdfasdf</a> <span class='asdf'>asdf</span>"; 
> str.replace(/asd(?=[^<>]*(<|$))/g, "<b>$&</b>") 

"<b>asd</b>f <a href='http://asdf.com'><b>asd</b>f<b>asd</b>f<b>asd</b>f</a> <span class='asdf'><b>asd</b>f</span>" 
3
str = str.replace(new RegExp("<a href='http://asdf.com'>", 'gi'), function(matched){return matched + "<b>"}); 

    str = str.replace(new RegExp('</a>', 'gi'), function(matched){return "</b>" + matched }); 

http://jsfiddle.net/5FZJQ/4/

+0

我不完全理解這個解決方案,我還沒有得到它的工作。 (regexToMatchStartOfaTag =='<')? –

+0

是否這樣? http://jsfiddle.net/5FZJQ/ –

+0

現在看看http://jsfiddle.net/5FZJQ/3/,根據你的需要進行調整 –

-1

你也許可以,只要使用CSS,如果你可以用它來逃脫第一個字母的僞類。

.asdf:first-letter { 
    font-weight:bold; 
} 

只是提示這個,因爲你的例子在兩個開頭都放了'a'。

+0

它不是'asdfasdfasdf'。我相信':第一個字母'不支持explorer 8和低於 –

1
str = "asdf <a href='http://asdf.com'>asdfasdfasdf</a> <span class='asdf'>asdf</span>"; 
str = str.replace(/a(?!([^<]+)?>)/g, '<b>a</b>') 

你會匹配上面(/a(?!([^<]+)?>)/g)正則表達式讓每一個 'A' 標記的外然後替換爲'<b>a</b>'。

返回的HTML是:

<b>a</b>sdf <a href='http://asdf.com'><b>a</b>sdf<b>a</b>sdf<b>a</b>sdf</a> <span class='asdf'><b>a</b>sdf</span> 
0

你必須拉出html標籤,然後才能做替換,這樣你就不會混合的它裏面的標籤和其它A。

那麼你必須做出替代全球將產生正則表達式。

這是有點長,但這將工作,我敢肯定有人可以簡化解決方案。

var str = "asdf <a href='http://asdf.com'>asdfasdfasdf</a> <span class='asdf'>asdf</span>", 
// strip all html tags 
// $1 is used to hold reference to the spot 
stripped = str.replace(/<[^<>]+>/g, '$1'), 
// keep a reference to all stripped tags 
split = str.match(/<[^<>]+>/g), 
// highlight the a's with the html tags stripped 
highlight = stripped.replace(/a/g, "<b>a</b>"), 
// loop length 
len = split.length; 

// loop through every html tag reference '$1' and replace it back in 
for(var x = 0; x<len; x++) { 
    highlight = highlight.replace("$1", split[x]); 
} 

JSFIDDLE

一個不太詳細的版本:

tags = str.match(/<[^<>]+>/g), 

highlight = str.replace(/<[^<>]+>/g, '@@'). 
    replace(/a/g, "<b>a</b>"). 
    replace(/@@/g, function() { return tags.shift() }); 

http://jsfiddle.net/X9cZg/1/

+0

爲什麼投票?大聲笑我知道它的漫長,但它的工作 –

+1

這實際上是一個非常好的方法(比我更好),可以寫得相當簡潔。 – georg

+0

@ thg435感謝+1,編輯和讚美 –