2011-11-09 73 views
3

我有一個變量,其中包含一個表示XML文檔的長字符串。在該字符串中,我需要搜索每個自閉標籤並將其擴展爲兩個匹配的開/關標籤。我真的不知道如何解決這個問題,並會感謝您的建議。在這一點上,我所知道的是如何搭配通過正則表達式自動關閉標籤:[^<]+?/>這裏是我想完成什麼簡單的例子:如何使用JavaScript循環一個長字符串以在每次匹配後插入一個新字符串

原始字符串:

<outer-tag> 
    <inner-tag-1> 
     <SELF-CLOSING-TAG-1 foo="bar"/> 
     <SELF-CLOSING-TAG-2/> 
    </inner-tag-1> 
    <inner-tag-2> 
     <SELF-CLOSING-TAG-3 attr="value"/> 
    </inner-tag-2> 
</outer-tag> 

修改後的字符串:

<outer-tag> 
    <inner-tag-1> 
     <SELF-CLOSING-TAG-1 foo="bar"></SELF-CLOSING-TAG-1> 
     <SELF-CLOSING-TAG-2></SELF-CLOSING-TAG-2> 
    </inner-tag-1> 
    <inner-tag-2> 
     <SELF-CLOSING-TAG-3 attr="value"></SELF-CLOSING-TAG-3> 
    </inner-tag-2> 
</outer-tag> 

回答

3

我已經使用w3 specifications來創建正確解析格式良好的XML中的標記的正則表達式。

首先,選擇定義開始標籤的字符(每個規格)。然後,匹配其餘字符,排除可能尾隨空格和/>。全局替換匹配的子串由
"<" + starttag + remaining + "></" + starttag + ">"。見下:

//According to the W3 spec: 
var pattern = /<([:A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][-.0-9\xB7\u0300-\u036F\u0203F-\u2040]*)([^>]*?)\s*?\/>/g; 
string.replace(pattern, '<$1$2></$1>'); 
+0

完美的作品!非常感謝。 – jake

3

嘗試

the_string.replace(/< *(\w+)([^<\/>]*)\/>/g, "<$1$2></$1>") 

說明:

<   opening tag 
    ' *'  ignore whitespace 
$1 (\w+)  tag name (remember at $1) 
$2 ([^<\/>]*) attributes (remember at $2) 
    \/>  close tag 
+0

這工作得很好,並解決問題。唯一的改進是防止上面的正則表達式在每個開始標籤的末尾添加一個空格。謝謝你的幫助。 – jake

相關問題