2011-11-09 5 views
3

XML文書を表す長い文字列を含む変数があります。その文字列内で、私はすべての自己終了タグを検索し、2つの一致する開始/終了タグに展開する必要があります。私は本当にこれに対処する方法がわからないし、あなたのアドバイスを感謝します。この時点で、私が知っているすべては、正規表現を経由して自己終了タグと一致する方法である: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のタグを正しく解析するregexpを作成するために使用しました。

最初に、開始タグ(スペックごと)を定義する文字を選択します。残りの文字をマッチさせます。末尾に余白があり、/>を除きます。一致する部分文字列をグローバルに置き換えて
"<" + 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

関連する問題