regexp
Paul
- javascript
Moin.
Komme einfach nicht auf die richtige Syntax. Ich habe einen String in JS (z.B.: "Hallo <SPAN style="color:red">Du</SPAN> da"), aus dem ich nun alle HTML-Tag entfernen möchte. Habe mit folgendem angefangen:
text = text.replace(/[<>]/g, "");
Das entfernt mir aber nur die Klammer. Ich muss jetzt alles innerhalb auch noch löschen. Nur wie?
Paul
Hallo,
Komme einfach nicht auf die richtige Syntax. Ich habe einen String in JS (z.B.: "Hallo <SPAN style="color:red">Du</SPAN> da"), aus dem ich nun alle HTML-Tag entfernen möchte. Habe mit folgendem angefangen:
text = text.replace(/[<>]/g, "");
Das entfernt mir aber nur die Klammer. Ich muss jetzt alles innerhalb auch noch löschen. Nur wie?
am besten mit einfachen Zeichenkettenoperationen, denn derzeit hast Du zwei Probleme.
Freundliche Grüße
Vinzenz
Würde gerne ohne regexp arbeiten. Aber wie?
Paul
Würde gerne ohne regexp arbeiten. Aber wie?
Paul
Ein üblicher Ansatz wäre zB
<[^>]+>
Ein Kleiner-als-Zeichen gefolgt von 1 oder mehr ^NICHT Größer-als-Zeichen gefolgt von einem Größer-als-Zeichen. Damit werden die Tags entfernt, nicht aber der Inhalt. <weg>bleibt</weg>
Viel Erfolg!
Ein üblicher Ansatz wäre zB
<[^>]+>
Ein Kleiner-als-Zeichen gefolgt von 1 oder mehr ^NICHT Größer-als-Zeichen gefolgt von einem Größer-als-Zeichen. Damit werden die Tags entfernt, nicht aber der Inhalt. <weg>bleibt</weg>
Was dann zur Folge hat, dass ziemlich viel Mist stehen bleibt, der ggf. garnicht rein soll - z.B. Inhalte von script-Elementen.
@@Vinzenz Mai:
nuqneH
am besten mit einfachen Zeichenkettenoperationen, denn derzeit hast Du zwei Probleme.
Nö, würde ich nicht sagen. Reguläre Ausdrücke sind dafür prädestiniert, Muster zu erkennen wie '<' gefolgt von Zeichen gefolgt von '>'.
Hier mit Stringoperationen ranzugehen, das erste Vorkommen von '<' zu suchen, dann das danach nächste Vorkommen von '>', dann das nächste Vorkommen von '<' … Dir viel Spaß dabei, allen anderen sei gesagt: Tu’s nicht!
Qapla'
@@Paul:
nuqneH
text = text.replace(/[<>]/g, "");
Das entfernt mir aber nur die Klammer.
Genau das hast du ja gesagt: Ersetze jedes der Zeichen '<' und '>' duch ''.
Ich muss jetzt alles innerhalb auch noch löschen. Nur wie?
In dem du sagst: Ersetze die http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichenketten@title=Zeichenkette '<' gefolgt von beliebig vielen Zeichen gefolgt von '>' (http://de.selfhtml.org/perl/sprache/regexpr.htm#gierig_genuegsam@title=non-greedy!).
Oder: Ersetze '<' gefolgt von beliebig vielen Zeichen http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=außer '>' gefolgt von '>' (kann dann greedy sein).
Qapla'
Hi,
Oder: Ersetze '<' gefolgt von beliebig vielen Zeichen http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=außer '>' gefolgt von '>' (kann dann greedy sein).
Aber:
<img src='PfeilNachRechts.png' alt='--->'>
;-)
cu,
Andreas
@@MudGuard:
nuqneH
Aber:
<img src='PfeilNachRechts.png' alt='--->'>
Ähm ja, ich hatte noch dran gedacht zu erwähnen, dass die Sache deutlich komplizierter wird, wenn '>' im Attributwert oder Elementinhalt (wie suit bemerkte) auftritt. Und es dann doch vergessen.
Qapla'
Moin Moin!
Aber:
<img src='PfeilNachRechts.png' alt='--->'>Ähm ja, ich hatte noch dran gedacht zu erwähnen, dass die Sache deutlich komplizierter wird, wenn '>' im Attributwert oder Elementinhalt (wie suit bemerkte) auftritt.
Und genau deswegen nimmt man sich einen Standard-konformen Parser statt mit RegExps herumzupfuschen. Denn gerade diese Gemeinheiten kann ein Parser verdauen, selbstgestrickte RegExps aber nur sehr selten bis gar nicht.
Alexander
@@Gunnar Bittersmann:
nuqneH
Ähm ja, ich hatte noch dran gedacht zu erwähnen, dass die Sache deutlich komplizierter wird, wenn '>' im Attributwert oder Elementinhalt (wie suit bemerkte) auftritt. Und es dann doch vergessen.
Mit regulärem Ausdruck geht es nicht, aber replace(/<(.*?)(?:\s+(?:.+?="[^"]*"|.+?='[^']*'))*\s*>(.*?)<\/\1>/g, '$2')
sollte mit allem klarkommen, oder?
Qapla'
@@Gunnar Bittersmann:
nuqneH
replace(/<(.*?)(?:\s+(?:.+?="[^"]*"|.+?='[^']*'))*\s*>(.*?)<\/\1>/g, '$2')
sollte mit allem klarkommen, oder?
Nein, nicht mit Attributen ohne Wert.
replace(/<(.*?)(?:\s+.+?(?:="[^"]*"|='[^']*')?)*\s*>(.*?)<\/\1>/g, '$2')
Qapla'
Nein, nicht mit Attributen ohne Wert.
replace(/<(.*?)(?:\s+.+?(?:="[^"]*"|='[^']*')?)*\s*>(.*?)<\/\1>/g, '$2')
Qapla'
Das sieht doch sehr schön aus auf den ersten Blick :-)
@@Gunnar Bittersmann:
nuqneH
replace(/<(.*?)(?:\s+.+?(?:="[^"]*"|='[^']*')?)*\s*>(.*?)<\/\1>/g, '$2')
Da fehlt immer noch Whitespace – und das gleich an mehreren Stellen:
replace(/<(.*?)(?:\s+.+?(?:=\s*"[^"]*"|=\s*'[^']*')?)*\s*>(.*?)<\/\1\s*>/g, '$2')
Qapla'
@@Gunnar Bittersmann:
nuqneH
replace(/<(.*?)(?:\s+.+?(?:="[^"]*"|='[^']*')?)*\s*>(.*?)<\/\1>/g, '$2')
Da fehlt immer noch Whitespace – und das gleich an mehreren Stellen:
replace(/<(.*?)(?:\s+.+?(?:=\s*"[^"]*"|=\s*'[^']*')?)*\s*>(.*?)<\/\1\s*>/g, '$2')
Qapla'
Hi Gunnar,
Da fehlt immer noch Whitespace
ja, ist mir auch aufgefallen.
Glaube viel schöner/besser, kann man es nicht umsetzen mit einem - noch überschaubaren - regulären Ausdruck.
Robert
@@Jonny 5:
nuqneH
replace(/<(.*?)(?:\s+.+?(?:=\s*"[^"]*"|=\s*'[^']*')?)*\s*>(.*?)<\/\1\s*>/g, '$2')
Glaube viel schöner/besser, kann man es nicht umsetzen mit einem - noch überschaubaren - regulären Ausdruck.
Das ist kein regulärer Ausdruck.
Qapla'
Das ist kein regulärer Ausdruck.
Qapla'
Aha, Wikipedia definiert also, was ein regulärer Ausdruck ist.
Wortklauberei in Wikipedia nachschlagen.
@@Jonny 5:
nuqneH
Aha, Wikipedia definiert also, was ein regulärer Ausdruck ist.
Nein, Wikipedia gibt das wieder, was Informatik-Lehrbücher auch sagen.
Und es ist sinnfrei, etwas als „regulär“ zu bezeichnen, was nicht regulär ist.
Wortklauberei in Wikipedia nachschlagen.
Chomsky-Hierarchie in Wikipedia nachschlagen.
Qapla'
@@Jonny 5:
nuqneH
Aha, Wikipedia definiert also, was ein regulärer Ausdruck ist.
Nein, Wikipedia gibt das wieder, was Informatik-Lehrbücher auch sagen.
Und es ist sinnfrei, etwas als „regulär“ zu bezeichnen, was nicht regulär ist.
Wortklauberei in Wikipedia nachschlagen.
Chomsky-Hierarchie in Wikipedia nachschlagen.
Solche Suchmuster bezeichnet man als reguläre Ausdrücke. Auch wenn sie die ursprüngliche Definition erweitern, ist es nicht falsch, sie so zu bezeichnen.
Patterns for non-regular languages
Sonst könnte man ja die einschlägige Fachliteratur teils in den Ofen schmeissen.
@@Jonny 5:
nuqneH
Aha, Wikipedia definiert also, was ein regulärer Ausdruck ist.
Nein, Wikipedia gibt das wieder, was Informatik-Lehrbücher auch sagen.
Und es ist sinnfrei, etwas als „regulär“ zu bezeichnen, was nicht regulär ist.
Wortklauberei in Wikipedia nachschlagen.
Chomsky-Hierarchie in Wikipedia nachschlagen.
Solche Suchmuster bezeichnet man als reguläre Ausdrücke. Auch wenn sie die ursprüngliche Definition erweitern, ist es nicht falsch, sie so zu bezeichnen.
Patterns for non-regular languages
Sonst könnte man ja die einschlägige Fachliteratur teils in den Ofen schmeissen.
@@Jonny 5:
nuqneH
Solche Suchmuster bezeichnet man als reguläre Ausdrücke.
„Man“ meint alle, die nicht wissen, was reguläre Ausdrücke wirklich sind.
Auch wenn sie die ursprüngliche Definition erweitern, ist es nicht falsch, sie so zu bezeichnen.
Die Falschheit liegt im Auge des Betrachters.
“The language of squares is not regular, nor is it context-free. Pattern matching with an unbounded number of back references, as supported by numerous modern tools, is NP-complete […]” Sag ich doch.
Die falsche Verwendung des Begriffs “has led to a nomenclature where the term regular expression has different meanings in formal language theory and pattern matching.” Ich halte verschiedene Bedeutungen eines B
Fachbegriffs innerhalb desselben Fachgebiets für nicht sinnvoll.
Sonst könnte man ja die einschlägige Fachliteratur teils in den Ofen schmeissen.
Janeeisklar, so wie auch die einschlägige Fachliteratur, die HTML-Elemente als „Tags“ bezeichnet.
Qapla'
Lieber Gunnar,
“The language of squares is not regular, nor is it context-free. Pattern matching with an unbounded number of back references, as supported by numerous modern tools, is NP-complete […]” Sag ich doch.
Ja, du hast ja auch vollkommen recht, mit dem was du meinst, nur meinst du das falsche. Womit sich dieser Absatz ja auch beschäftigt.
Ich halte es für bedenklich, mit welcher Hartnäckigkeit du deine fragwürdige Haltung zu richtig/falsch verteidigst. Was du als falsch bezeichnest ist nicht falsch, sondern, wie du selbst schreibst...
Die Falschheit liegt im Auge des Betrachters.
Ergo, könnte ich sagen: Was du schreibst ist falsch.
Regular language in Wikipedia nachschlagen:
Note that the "regular expression" features provided with many programming languages are augmented with features that make them capable of recognizing languages that can not be expressed by the formal regular expressions
@@Jonny 5:
nuqneH
Ja, du hast ja auch vollkommen recht, mit dem was du meinst, nur meinst du das falsche.
Die Falschheit liegt im Auge des Betrachters.
Ich halte es für bedenklich, mit welcher Hartnäckigkeit du deine fragwürdige Haltung zu richtig/falsch verteidigst.
Ich halte es für bedenklich, Fachbegriffe zu verwässern und ihnen eine fragwürdige Bedeutung zu geben.
Note that the "regular expression" features provided with many programming languages are augmented with features that make them capable of recognizing languages that can not be expressed by the formal regular expressions
Warum sollte man „regulärer Ausdruck“ in Anführungszeichen setzen*, um Suchmuster von formalen regulären Ausdrücken zu unterscheiden? Ich halte es für sinnvoller, Suchmuster als das zu bezeichnen, was sie sind: Suchmuster.
Qapla'
* Das wäre genauso bescheuert wie „DDR“ in der Springer-Presse.
Warum sollte man „regulärer Ausdruck“ in Anführungszeichen setzen*, um Suchmuster von formalen regulären Ausdrücken zu unterscheiden? Ich halte es für sinnvoller, Suchmuster als das zu bezeichnen, was sie sind: Suchmuster.
"regular expression" features provided with many programming languages...
Weil die Diskussion ursprünglich in diesem Kontext startete. Nicht zu durch Typ-3-Grammatiken der Chomsky Hierarchie erzeugten regulären Sprachen.
computer science - Regular Expressions question
The problem is that "regular expression" has to be decoded by context.
Die Anführungszeichen, da dieser Begriff entsprechend dem Kontext in dem er verwendet wird interpretiert werden kann.
@@Jonny 5:
nuqneH
Die Anführungszeichen, da dieser Begriff entsprechend dem Kontext in dem er verwendet wird interpretiert werden kann.
Ja, Sprache ist oft nicht eindeutig. „Maus“ und „Bug“ bezeichnen im Kontext Computerei völlig andere Dinge als im Kontext Tierwelt.
Aber Fachsprache sollte in einem Gebiet sollte schon eindeutig sein. So weit liegen (theoretische) Informatik und Programmierung nicht auseinander, als dass verschiedene Bedeutungen desselben Fachbegriffs „regulärer Ausdruck“ sinnvoll wären.
Natürlich hat das Sprachproblem historische Ursachen: Hätten Suchmuster in Programmiersprachen von Anfang an die Mächtigkeit gehabt, die über reguläre Ausdrücke hinausgeht, wären Suchmuster gar nicht erst als „reguläre Ausdrücke“ bezeichnet worden. IMHO sollte man es heute auch nicht tun; es gibt den passenden Begriff „Suchmuster“ (engl. „search pattern“). Er ist nicht nur treffender, sondern auch kürzer – seiner Verwendung steht nicht entgegen.
Qapla'
Natürlich hat das Sprachproblem historische Ursachen: Hätten Suchmuster in Programmiersprachen von Anfang an die Mächtigkeit gehabt, die über reguläre Ausdrücke hinausgeht, wären Suchmuster gar nicht erst als „reguläre Ausdrücke“ bezeichnet worden. IMHO sollte man es heute auch nicht tun; es gibt den passenden Begriff „Suchmuster“ (engl. „search pattern“). Er ist nicht nur treffender, sondern auch kürzer – seiner Verwendung steht nicht entgegen.
*gähn*
Um wieder zum Thema zu kommen und doch noch ein für dich erträgliches Lob loswerden zu können: Du hast ein schönes Suchmuster geschrieben.
Den Standpunkt, den du vertrittst kann man respektieren. Das ist eine subjektive Sicht, mit der man andere aber nicht zu vergewaltigen braucht.
Qui tacet, consentire videtur
@@Jonny 5:
nuqneH
Um wieder zum Thema zu kommen und doch noch ein für dich erträgliches Lob loswerden zu können: Du hast ein schönes Suchmuster geschrieben.
Das klingt wie Musik in meinen Ohren – und das in mehrfacher Hinsicht. ;-)
Qui tacet, consentire videtur
Jetzt bist du mit deinem Ende am Latein.
Qapla'
Um wieder zum Thema zu kommen und doch noch ein für dich erträgliches Lob loswerden zu können: Du hast ein schönes Suchmuster geschrieben.
Das klingt wie Musik in meinen Ohren – und das in mehrfacher Hinsicht. ;-)
Ich wage zu bezweifeln, dass die Melodie in der Musik erfasst wurde.
Borniertheit im Duden nachschlagen.
Qui tacet, consentire videtur
Jetzt bist du mit deinem Ende am Latein.
Nicht ganz.
Si tacuisses, philosophus mansisses.
Aber jetzt :-)
Schönes Wochenende!
@@Jonny 5:
nuqneH
Wortklauberei in Wikipedia nachschlagen.
Ich hab auch noch einen für dich: Totschlagargument in Wikipedia nachschlagen.
„Das sagt man so“ ist so ziemlich das einzige, was du meinem Argument, warum man das nicht so sagen sollte, entgegenzusetzen hast.
Auch nur eine „eine subjektive Sicht“, selbstverständlich.
Qapla'
Hallo Gunnar,
Da fehlt immer noch Whitespace – und das gleich an mehreren Stellen:
replace(/<(.*?)(?:\s+.+?(?:=\s*"[^"]*"|=\s*'[^']*')?)*\s*>(.*?)<\/\1\s*>/g, '$2')
die Welt wäre eine @~!$%&-Welt ohne Sprachen, die eine solche Syntax erwarten. :)
Gruß, Jürgen
@@JürgenB:
nuqneH
replace(/<(.*?)(?:\s+.+?(?:=\s*"[^"]*"|=\s*'[^']*')?)*\s*>(.*?)<\/\1\s*>/g, '$2')
die Welt wäre eine @~!$%&-Welt ohne Sprachen, die eine solche Syntax erwarten. :)
1987 ;-)
Qapla'
@@Gunnar Bittersmann:
nuqneH
'<' gefolgt von beliebig vielen Zeichen gefolgt von '>' (http://de.selfhtml.org/perl/sprache/regexpr.htm#gierig_genuegsam@title=non-greedy!).
Oder: Ersetze '<' gefolgt von beliebig vielen Zeichen http://de.selfhtml.org/perl/sprache/regexpr.htm#zeichen@title=außer '>' gefolgt von '>' (kann dann greedy sein).
Welches von beidem ist eigentlich performanter?
Qapla'
Vielen Dank Euch allen.
Habe es jetzt mit folgendem gelöst:
http://javascript.jstruebig.de/javascript/35
Vielen Dank Euch allen.
Habe es jetzt mit folgendem gelöst:
http://javascript.jstruebig.de/javascript/35
von der Seite:
// now remove the tags
return tmp.replace(/</?[^>]+>/gi, '');
Wobei man sich frägt, wozu der Slash-Teil /?
Hi,
// now remove the tags
return tmp.replace(/</?[^>]+>/gi, '');Wobei man sich frägt, wozu der Slash-Teil /?
Um schliessende Tags auch zu erwischen?
MfG ChrisB
@@ChrisB:
nuqneH
return tmp.replace(/</?[^>]+>/gi, '');
Wobei man sich frägt, wozu der Slash-Teil /?
Um schliessende Tags auch zu erwischen?
'/' ist aber mit [^>]+ abgedeckt. Wozu also der Slash-Teil?
Qapla'
Hi,
'/' ist aber mit [^>]+ abgedeckt.
Stimmt auch wieder.
MfG ChrisB
[latex]Mae govannen![/latex]
return tmp.replace(/</?[^>]+>/gi, '');
Wobei man sich frägt, wozu der Slash-Teil /?
Um schliessende Tags auch zu erwischen?
'/' ist aber mit [^>]+ abgedeckt. Wozu also der Slash-Teil?
Damit die Javascript-Engine nicht aufgrund der Zeichenkombination </script> für das Ende des Scriptbereiches hält, falls ein solcher in der Zeichenkette enthalten ist...
Stur lächeln und winken, Männer!
Kai
[latex]Mae govannen![/latex]
Damit die Javascript-Engine nicht aufgrund der Zeichenkombination </script> für das Ende des Scriptbereiches hält, falls ein solcher in der Zeichenkette enthalten ist...
Merke: Wenn man einen Satz nur oft genug umbaut, kommt in jedem Fall Unsinn dabei heraus.
Stur lächeln und winken, Männer!
Kai
Vielen Dank Euch allen.
Habe es jetzt mit folgendem gelöst:
http://javascript.jstruebig.de/javascript/35
von der Seite:
// now remove the tags
return tmp.replace(/</?[^>]+>/gi, '');Wobei man sich frägt, wozu der Slash-Teil /?
Und man sich frägt, wozu der i Modifier, aber besser mal eins zuviel als zuwänisch, wird man wohl gedacht haben, oder man möchte große und kleine Größer-als-Zeichen sobald diese implementiert werden ansprechen.
return tmp.replace(/</?[^>]+>/gi, '');
Wobei man sich frägt, wozu der Slash-Teil /?
Weil / den RegExp-Literal öffnet und schließt.
/…/…/ ergibt einen Syntaxfehler.
Mathias
@@molily:
nuqneH
Wobei man sich frägt, wozu der Slash-Teil /?
Weil / den RegExp-Literal öffnet und schließt.
Ähm, es ging um '/', nicht um '', denke ich.
Qapla'