Как использовать JavaScript для обхода длинной строки, чтобы вставить новую строку после каждого совпадения - PullRequest
3 голосов
/ 09 ноября 2011

У меня есть переменная, которая содержит длинную строку, которая представляет 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>

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Я использовал спецификации w3 для создания регулярного выражения, которое правильно анализирует теги в правильно сформированном 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>');
3 голосов
/ 09 ноября 2011

Попробуйте

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