Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript循环遍历长字符串,以便在每次匹配后插入新字符串_Javascript_Xml_Regex_Loops - Fatal编程技术网

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

如何使用JavaScript循环遍历长字符串,以便在每次匹配后插入新字符串,javascript,xml,regex,loops,Javascript,Xml,Regex,Loops,我有一个变量,它包含一个表示XML文档的长字符串。在该字符串中,我需要搜索每个自动结束标记,并展开为两个匹配的开始/结束标记。我真的不知道如何解决这个问题,希望你能给我一些建议。此时,我只知道如何通过正则表达式匹配自动关闭标记:[^以下是我希望完成的一个简短示例: 原始字符串: <outer-tag> <inner-tag-1> <SELF-CLOSING-TAG-1 foo="bar"/> <SELF-CLOSI

我有一个变量,它包含一个表示XML文档的长字符串。在该字符串中,我需要搜索每个自动结束标记,并展开为两个匹配的开始/结束标记。我真的不知道如何解决这个问题,希望你能给我一些建议。此时,我只知道如何通过正则表达式匹配自动关闭标记:
[^
以下是我希望完成的一个简短示例:

原始字符串:

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

试试看

字符串。替换(/<*(\w+)\/>/g,”)
说明:

   <          opening tag
   ' *'       ignore whitespace
$1 (\w+)      tag name (remember at $1)
$2 ([^<\/>]*) attributes (remember at $2)
   \/>        close tag
关闭标签
我使用创建了一个regexp,可以正确解析格式良好的XML中的标记

首先,选择定义起始标记的字符(根据规格)。然后,匹配剩余字符,可能不包括尾随空格和
/>
。全局将匹配的子字符串替换为
。请参见以下内容:

//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>');
//根据W3规范:
变量模式=/]*?)\s*?\/>/g;
字符串。替换(模式“”);

工作正常!非常感谢。这非常有效,确实解决了问题。唯一的改进是防止上述正则表达式在每个开始标记的末尾添加空格。谢谢你的帮助。