2013-07-05 14 views
5

Mam ciąg z możliwością wielokrotnego tagów CDATA wewnątrz:Wymień tagów CDATA w xml

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

Używam javascript/jQuery i trzeba usunąć wiele tagów CDATA (zastąpić je "").

Jak mogę to napisać przy użyciu wyrażenia regularnego?

+1

Próba zrobienia tego z regex doprowadzi do szaleństwa. Zobacz [tę odpowiedź] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

Czy chcesz usunąć tylko '', czy wszystko w tym tekst wewnątrz znacznika? –

+0

Po prostu chcę usunąć wszystkie wystąpienia tagów cdata, używając: string.replace ("", ""); usunie tylko jeden. – Toniq

Odpowiedz

5

@Jim Garrison ma rację w swoim komentarzu powyżej: nie ma sposobu, aby solidnie parsować XML/HTML z wyrażeń regularnych. Język jest zbyt skomplikowany, aby mógł być reprezentowany przez wyrażenie regularne.

Nie oznacza to jednak, że nie można napisać wyrażenia regularnego, które będzie dotyczyło najrozsądniejszych przypadków :, co prawdopodobnie będzie wystarczające dla potrzeb użytkownika. Na przykład, następujące regex JavaScript będzie głównie to, co chcesz:

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

dwie rzeczy noty w tym wyrażenia regularnego: w asterisk (.*?) wewnątrz organizmu CDATA jest leniwy z modyfikatorem ?. Bez tego, co następuje źle by się stało:

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

Inną rzeczą jest to, że możemy użyć flagi g się wskazywać, że wszystkie mecze powinny zostać wymienione. W przeciwnym razie tylko pierwszy mecz zostanie zastąpiony.

Po przeczytaniu komentarza wygląda na to, że można po prostu usunąć tagi CDATA, pozostawiając ich zawartość nienaruszoną. Jak wskazuje powyższy @Jim Garrison, jest to zły pomysł, ponieważ można łatwo pozostawić niedozwolony kod HTML; o to chodzi w CDATA. Ale jeśli chcesz to zrobić, oto w jaki sposób:

'outside <![CDATA[(cdata1)]]> inside <![CDATA[(cdata2)]]> after' 
    .replace(/<!\[CDATA\[(.*?)\]\]>/g, '$1'); 
// yields "outside (cdata1) inside (cdata2) after"