2011-02-25 74 views
2

有一個標籤類型的字符串正則表達式我要取代之間的所有字符串,前後<span style="[^"]+">.*?</span>標籤可能在字符串span標籤(沒有其他HTML標記,只是簡單的文本) 我像這樣有正則表達式。用於替換在Javascript中

var span_re = /^(.+)(?=<span)|(?=<\/span>)(.+)(?=<span)|(?=<\/span>)(.+)$/g; 
str = str.replace(span_re, '<span>$1</span>'); 

該字符串

'foo<span style="text-decoration:underline;">bar</span>baz' 

'<span>foo</span><span style="text-decoration:underline;">bar<span></span>' 

我想這一點:

'<span>foo</span><span style="text-decoration:underline;">bar</span><span>baz</span>' 

我也嘗試使用:.+?.*?而是捕獲完整的表達式而沒有結果的。

我不需要解析器我不解析XHTML,也沒有自包含的標記。

+0

可能重複http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags)...請僅使用HTML解析器:( – 2011-02-25 21:05:28

+1

我不想解析XHTML我只有一個標籤類型(跨度)和文本之前,之間,之後 - 爲什麼使用複雜的東西作爲解析器進行這個簡單的替換,I line的代碼,而不是〜1k的解析器。 – jcubic 2011-02-25 21:45:03

+0

@MattBall是的,你應該使用一個解析器,是因爲它可能:這是[義務鏈接](http://stackoverflow.com/q/4231382/471272);請鏈接到實際答案,而不是非答案 – tchrist 2014-06-08 20:09:02

回答

1

解析HTML使用正則表達式是很少一個好主意,特殊性在Web瀏覽器的情況下。這裏有一個簡單的例子,讓你想要什麼,使用jQuery:

即使是HTML是不是已經在DOM中,很容易把它包在一個虛設的元素:

var wrapper = $('<div />') 
wrapper.html('foo<span style="text-decoration:underline;">bar</span>baz'); 
wrapper.contents() 
    .filter(
     function(){return this.nodeType == 3;} //select text nodes only 
    ) 
    .wrap('<span />'); 

作爲獎勵,這可以和其他標籤一起使用,即使你有幾個<span>標籤,其自由文本之間的他們。

工作實施例:http://jsbin.com/acigu5/

[除XHTML自包含標籤的正則表達式匹配開放標籤](的
+0

感謝您的回答,但我已經找到了解決方案 - span標籤是由我創建的,當我替換爲像這樣的字符串[[uib; color; background] text]'span標籤樣式),所以而不是使用替換先分割字符串,並得到tex t在格式化字符串之間並且不需要匹配標籤。 – jcubic 2011-02-26 20:19:30

1

您可能會過度複雜化它。如果你知道你只可能有一個<span>,沒有任何其他標記和沒有轉義>跡象,你可以使用這個簡單的正則表達式:

s = s.replace(/^[^<]+|[^>]+$/gi, '<span>$&</span>'); 

此正則表達式查找文本標記之前(從一開始,不<)或在標籤之後(不是>,直到結束),並用<span>包裝它們。 $&在JavaScript中正則表達式替換代表整個比賽或組0(其他風格,可能是\0$0)。

請注意,(?=<\/span>)從您的原始正則表達式是一個預測,而不是一個後視(JavaScript沒有後視,羞愧)。這導致(.+)匹配結束標記並將其消耗,導致HTML無效。

工作例如:http://jsbin.com/acexu4/

+0

感謝這一點,但我沒有一個標籤,但一個標籤類型 - 所以他們可能會喜歡他們,但沒有嵌套。很高興知道JavaScript沒有 – jcubic 2011-02-26 19:59:01