如何使用JavaScript循环遍历长字符串以在每次匹配后插入新字符串

时间:2011-11-09 16:47:36

标签: javascript xml regex loops

我有一个包含表示XML文档的长字符串的变量。在该字符串中,我需要搜索每个自动关闭标记并扩展为两个匹配的开始/结束标记。我真的不确定如何解决这个问题,并希望得到你的建议。在这一点上,我所知道的是如何通过正则表达式来匹配自动关闭标签:[^<]+?/>这是我想要完成的一个简短示例:

ORIGINAL STRING:

<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>

MODIFIED STRING:

<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>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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>');