2013-07-05 2 views
5

У меня есть строка с возможными тегами множественным CDATA внутри:Заменить CDATA теги в XML

<![CDATA[A Survey of Applications of Identity-Based Cryptography in Mobile Ad-Hoc Networks]]> 

Я использую JavaScript/JQuery и мне нужно удалить несколько тегов CDATA (заменить их на «»).

Как я могу написать это с помощью регулярного выражения?

+1

Попытка сделать это с помощью регулярного выражения приведет к безумию. См. [Этот ответ] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

Вы хотите удалить только ' 'или все, включая текст внутри тега? –

+0

Я просто хочу удалить все вхождения тегов cdata, используя это: string.replace ("", ""); будет удалять только один. – Toniq

ответ

5

@Jim Garrison верен в своем комментарии выше: нет никакого способа безошибочно анализировать XML/HTML с регулярными выражениями. Язык слишком сложный, чтобы быть представленным регулярным выражением.

Однако это не означает, что вы не можете написать регулярное выражение, которое будет охватывать наиболее разумные случаи, которых, вероятно, будет достаточно для ваших нужд. Например, следующий JavaScript регулярное выражение будет в основном делать то, что вы хотите:

input.replace(/<!\[CDATA\[.*?\]\]>/g, ''); 

две вещи примечательные в этом регулярном выражении: групповой символ (.*?) внутри тела CDATA выполнен ленивым с модификатором ?. Без этого, следующий плохо будет происходить:

'before <![CDATA[blah]]> some stuff between <![CDATA[another cdata]]> after' 
    .replace(/<!\[CDATA\[.*\]\]>/g, ''); 
// returns "before after" when we probably 
// wanted "before some stuff between after" 

Другое дело в том, что мы используем g флаг, чтобы указать, что все матчи должны быть заменены. В противном случае будет заменено только первое совпадение.

Чтение комментариев, похоже, вы можете просто вырезать теги CDATA, оставив их содержимое неповрежденным. Как отмечает @Jim Garrison, это плохая идея, потому что вы можете легко оставить недопустимый HTML; вот в чем дело CDATA. Но если вы хотите это сделать, вот как это делается:

'outside <![CDATA[(cdata1)]]> inside <![CDATA[(cdata2)]]> after' 
    .replace(/<!\[CDATA\[(.*?)\]\]>/g, '$1'); 
// yields "outside (cdata1) inside (cdata2) after" 
Смежные вопросы