@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"
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) –
Czy chcesz usunąć tylko '', czy wszystko w tym tekst wewnątrz znacznika? –
Po prostu chcę usunąć wszystkie wystąpienia tagów cdata, używając: string.replace ("", ""); usunie tylko jeden. – Toniq