2013-07-05 23 views
5

Ich habe eine Zeichenfolge mit mehreren möglichen cdata Tags innen:CDATA-Tags in XML

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

Ich bin mit Javascript/jquery und ich brauche, um mehrere CDATA-Tags zu entfernen (ersetzen sie durch "").

Wie könnte ich das mit Regex schreiben?

+1

Der Versuch, dies mit Regex zu tun, wird zu Wahnsinn führen. Siehe [diese Antwort] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#1732454) –

+0

Möchten Sie nur das ' 'oder alles einschließlich des Textes innerhalb des Tags? –

+0

Ich möchte nur alle Vorkommen von cdata-Tags entfernen, indem ich folgendes benutze: string.replace ("", ""); Entferne nur einen. – Toniq

Antwort

5

@Jim Garrison ist in seinem Kommentar oben korrekt: Es gibt keine Möglichkeit, robust XML/HTML mit regulären Ausdrücken zu analysieren. Die Sprache ist zu komplex, um durch einen regulären Ausdruck dargestellt zu werden.

Das bedeutet jedoch nicht, dass Sie keine Regex schreiben können, die die meisten vernünftigen Fälle abdecken, die wahrscheinlich für Ihre Bedürfnisse ausreichend sein wird. Zum Beispiel werden meist folgende JavaScript Regex tun, was Sie wollen:

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

Die zwei Dinge bemerken in diesem regulären Ausdruck: der Platzhalter (.*?) innerhalb des CDATA Körpers wird mit dem ? Modifikator gemacht faul. Ohne diese wäre die folgende schlechte Sache geschehen:

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

Die andere Sache ist, dass wir die g Flagge, um anzuzeigen, verwenden, dass alle Spiele ersetzt werden sollte. Andernfalls wird nur das erste Spiel ersetzt.

Lesen Sie die Kommentare, es sieht so aus, als ob Sie die CDATA-Tags einfach ausstrippen möchten, während Sie ihren Inhalt intakt lassen. Wie @Jim Garrison oben erwähnt hat, ist dies eine schlechte Idee, weil Sie leicht mit ungültigem HTML belassen werden könnten; Das ist der springende Punkt von CDATA. Aber wenn du das willst, hier ist wie:

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