2012-06-27 7 views
48

Mögliche Duplizieren zu entfernen:
Regular expression to remove HTML tagsRegulärer Ausdruck zu HTML-Tags aus einem String

Gibt es einen Ausdruck, der den Wert zwischen zwei HTML-Tags erhalten wird?

Vor diesem Hintergrund:

<td class="played">0</td> 

Ich bin für einen Ausdruck suchen, die 0 zurückkehren, Strippen der <td> Tags.

+3

Ist das die Saite, die ganze Saite und nichts als die Saite? Wenn ja, wie wäre es mit '\ d +'? – Ryan

+1

Ich verwende so etwas: '(?: . +? | . +? | <(?:! | /? [A-zA-Z] +). *? /?>)' und Ersetzen durch "" ". –

+0

Wenn Sie diese Frage lesen, *** bitte *** lesen Sie die angenommene Antwort für das Duplikat. Die beiden oberen Antworten sind beide anfällig für eine sehr einfache Eingabe. TL; DR: Reguläre Ausdrücke sind *** nicht nützlich zum korrekten Entfernen von HTML-Tags. –

Antwort

31

wäre ein trivialer Ansatz

<[^>]*> 

mit nichts zu ersetzen sein. Aber je nachdem, wie schlecht strukturiert Ihre Eingabe ist, kann das scheitern.

+1

Ersatz ist nicht gut Ansatz. Für mehr Übereinstimmungen würden Sie sie zu einer Zeichenfolge zusammenführen. –

+0

Ich glaube nicht, dass ich das verstehe, was du sagen willst. – Joey

+0

Vorgegeben Erste Zweite ', mit einem' replaceAll' auf das Muster in Ihrem Beitrag würde 'FirstSecond' führen. –

3

Sie könnte es tun mit jsoup http://jsoup.org/

Whitelist whitelist = Whitelist.none(); 
String cleanStr = Jsoup.clean(yourText, whitelist); 
+6

JSoup ist eine sehr coole Bibliothek, aber wenn das OP nicht viel mehr tun will als nur den einfachen Ersatz, den er in seinem ursprünglichen Beitrag beschrieben hat, ist es wahrscheinlich eine ziemlich schwere Lösung. –

96

Sie nicht mit Regex zu analysieren HTML versuchen sollte. HTML ist keine reguläre Sprache, daher wird jede Regex, die Ihnen auffällt, wahrscheinlich in einem esoterischen Edge Case fehlschlagen. Bitte beachten Sie die grundlegende Antwort auf this question für Details. Obwohl es meistens als Witz formatiert ist, ist es ein sehr guter Punkt.


Die folgenden Beispiele sind Java, aber die regex wird ähnlich sein - wenn nicht identisch - für andere Sprachen.


String target = someString.replaceAll("<[^>]*>", ""); 

Angenommen, Ihre Nicht-HTML enthält keine < oder> und dass Ihre Eingabe Zeichenfolge richtig strukturiert ist.

Wenn Sie wissen, dass sie ein bestimmtes Tag sind - zum Beispiel wissen, dass Sie den Text nur <td>-Tags enthält, können Sie etwas tun könnte:

String target = someString.replaceAll("(?i)<td[^>]*>", ""); 

Edit: Ωmega brachte einen guten Punkt in ein Kommentar zu einem anderen Beitrag, dass dies zu mehreren Ergebnissen führen würde, die alle zusammengestaucht würden, wenn mehrere Tags vorhanden wären. Wenn die Eingabezeichenfolge <td>Something</td><td>Another Thing</td> lautet, würde das obige Ergebnis SomethingAnother Thing ergeben.

In einer Situation, wo mehrere Tags zu erwarten sind, wir so etwas wie tun könnte:

mit einem einzigen Raum
String target = someString.replaceAll("(?i)<td[^>]*>", " ").replaceAll("\\s+", " ").trim(); 

Dies ersetzt die HTML, kollabiert dann Leerzeichen, und dann trimmt jede an den Enden.

+2

Der Punkt hier ist, Match (es) zurückzugeben. Wenn es mehr Buchstaben in der Zeichenkette gab, werden Sie sie zu einer Verwirrung Zeichenkette zusammenfassen. Beispiel: '

text

hier

'. Got es? –

+0

Sie sollten mich für Anmerkungen nicht abmelden. Ich habe Sie nicht abgelehnt. Ich kann es beweisen, indem ich Sie jetzt ablehne, wenn Sie wollen ... –

+1

Das OP sagte: "Ich bin lo oking für einen Ausdruck, der 0 zurückgibt und die Tags entfernt. "Der Titel des Posts ist" regulärer Ausdruck, um HTML-Tags aus einem String zu entfernen ". Ich habe die '' Tags entfernt. Nirgends im OP hat er etwas über das Muster * Matching * erwähnt. –

Verwandte Themen