Bettina: Erstetzen von Strings mit regulären Ausdrücken

Hallo zusammen,

ich habe folgendes Problem:
Ich möchte aus dem String
   "<h1>Hier kommt</h1> Elke <b>Hinz</b> und <B>Kunz</B> nach <p>Hause</p> zum <div>Essen</div>"
mittles JS alle HTML-Tags heraus filtern.

Ich habe dazu folgenden Code geschrieben:

var vormals = "<h1>Hier kommt</h1> Elke <b>Hinz</b> und <B>Kunz</B> nach <p>Hause</p> zum <div>Essen</div>";
 //ersetze alle öffnenden 'einstelligen' tags (<b> und <p>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
 var jetzt = vormals.replace( /<.>/gi,"");
 alert(jetzt);

//ersetze alle schließenden 'einstelligen' tags (</b> und </p>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
 jetzt = jetzt.replace(/</.>/gi,"");
 alert(jetzt);

//ersetze alle öffnenden 'zweistelligen' tags (</h1>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
 var jetzt = vormals.replace( /<.>/gi,"");
 alert(jetzt);

//ersetze alle schließenden 'zweistelligen' tags (</h1>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
 jetzt = jetzt.replace(/</..>/gi,"");
 alert(jetzt);

So als Ergenis hätte ich nun den String:
"Hier kommt Elke Hinz und Kunz nach Hause zum <div>Essen</div>"

Natürlich könnte ich nun das ganze noch für dreistellige Tags machen, aber ich vermute mal, dass man das ganze auch in ein Statement zusammen fassen kann.

So, nun meine konkrete Frage: könnt Ihr mir sagen wie ich öffnende UND schließende HTML Tags, mit beliebig vielen Zeichen zwischen den spitzen Klammern aus einem String entferne?

In SelfHtml habe ich mir übrigens das Kapitel für RegExp bereits angeschaut, aber keine Lösung gefunden. Wahrscheinlich kapiere ich es noch nicht so ganz.

Vielen Dank im Voraus

Grüssle
Bettina

  1. Hallo,

    Ich möchte aus dem String
    mittles JS alle HTML-Tags heraus filtern.

    var vormals = "<h1>Hier kommt</h1> Elke <b>Hinz</b> und <B>Kunz</B> nach <p>Hause</p> zum <div>Essen</div>";
    //ersetze alle öffnenden 'einstelligen' tags (<b> und <p>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
    var jetzt = vormals.replace( /<.>/gi,"");

    Natürlich könnte ich nun das ganze noch für dreistellige Tags machen, aber ich vermute mal, dass man das ganze auch in ein Statement zusammen fassen kann.

    richtig, anstatt ein Zeichen zwischen < und > zu suchen, solltest du deshalb 'mindestens ein Zeichen' suchen: <.+>. Der geübte Musterungsexperte wird jetzt einwenden, dass das (und auch deine mehrstelligen Versuche) nicht funktionieren wird, weil .+ ganz gierig alles vom ersten < bis zum letzten > in der Zeile verschluckt. Deshalb muss der anspruchslose . durch eine Zeichenklasse ([]) ersetzt werden, die genau bestimmt, was zwischen öffnendem < und schließendem > kommen darf, nämlich kein (^) weiteres >: /<[^>]+>/. Und dann klappt es auch.

    Gruß, Frank.

    1. Hallo zusammen,

      Ihr habt mir alle sehr geholfen. Die Beiträge waren nützlich.
      Vielen Dank

      Gruss
      Bettina

    2. Hi,

      richtig, anstatt ein Zeichen zwischen < und > zu suchen, solltest du deshalb 'mindestens ein Zeichen' suchen: <.+>. Der geübte Musterungsexperte wird jetzt einwenden, dass das (und auch deine mehrstelligen Versuche) nicht funktionieren wird, weil .+ ganz gierig alles vom ersten < bis zum letzten > in der Zeile verschluckt. Deshalb muss der anspruchslose . durch eine Zeichenklasse ([]) ersetzt werden, die genau bestimmt, was zwischen öffnendem < und schließendem > kommen darf, nämlich kein (^) weiteres >: /<[^>]+>/. Und dann klappt es auch.

      <b title=">"> ist korrektes HTML.
      Mit Deinem Regex bleibt "> übrig.

      Meines Wissens ist es nicht mit einem Regex zu machen, wenn man alle korrekten Tags erwischen will (selbst wenn man die SHORTTAG-Schweinereien wie <title/bla/ unberücksichtigt läßt).

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. //ersetze alle öffnenden 'einstelligen' tags (<b> und <p>) beliebig oft(g) und unabhängig von Groß- Kleinschreibung (i)
    var jetzt = vormals.replace( /<.>/gi,"");

    Bettina,
    Auf "." treffen sowohl Groß- als auch Kleinbuchstaben zu; das "i" ist unnütz.

    Natürlich könnte ich nun das ganze noch für dreistellige Tags machen, aber ich vermute mal, dass man das ganze auch in ein Statement zusammen fassen kann. […] In SelfHtml habe ich mir übrigens das Kapitel für RegExp bereits angeschaut, aber keine Lösung gefunden.

    Du bist weder in http://de.selfhtml.org/javascript/objekte/regexp.htm noch in http://de.selfhtml.org/perl/sprache/regexpr.htm über "*" und "+" gestolpert?

    So, nun meine konkrete Frage: könnt Ihr mir sagen wie ich öffnende UND schließende HTML Tags, mit beliebig vielen Zeichen zwischen den spitzen Klammern aus einem String entferne?

    Such nach "<" gefolgt von beliebig vielen beliebigen Zeichen außer ">" gefolgt von ">".

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Es geht noch besser: Damit unmaskierte "<", die keinen Tag einleiten (hinter denen Whitespace ist), nicht ausgewählt werden:
      /<\S[^>]*>/g

      \S ist ein beliebiges Zeichen außer Whitespaces. Danach muss kein weiteres Zeichen mehr folgen, also * statt +.

      Live long and prosper,
      Gunnar

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
      1. Hallo,

        Es geht noch besser: Damit unmaskierte "<", die keinen Tag einleiten (hinter denen Whitespace ist), nicht ausgewählt werden:
        /<\S[^>]*>/g

        also wenn, dann mach' es doch gleich vernünftig: <[a-z/!][^>]*>. In HTML folgt auf die öffnende spitze Klammer immer ein Buchstabe von A bis Z, der Schrägstrich oder ein Ausrufungszeichen.

        Leerstellen gehören auch zu den Ausschlussgründen, aber da gibt es noch Dutzendweise mehr. Da könntest Du vegetarisches Essen auch nach "kein Huhn" spezifizieren.

        Gruß, Frank.

        1. also wenn, dann mach' es doch gleich vernünftig: <[a-z/!][^>]*>.

          Dito, Frank. ;-)
          Das "/" muss in JavaScript maskiert werden, da es als Begrenzer für reguläre Ausdrücke verwendet wird.

          In HTML folgt auf die öffnende spitze Klammer immer ein Buchstabe von A bis Z,

          Ähm, nein. Und du hast keinen derartigen Buchstaben in deinem Suchmuster.

          Mit vereinten Kräften haben wir’s nun zu <[a-zA-Z/!][^>]*> gebracht.

          Nach einem "/" darf aber auch nur ein Buchstabe folgen, damit das ein End-Tag sein kann: <[/]?[a-zA-Z!][^>]*>

          Live long and prosper,
          Gunnar

          --
          „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          1. Hi,

            Mit vereinten Kräften haben wir’s nun zu <[a-zA-Z/!][^>]*> gebracht.

            Die XML-Deklaration (und ähnliches) bleibt davon ziemlich unbeeindruckt.
            Auch ein ? kann direkt nach dem < vorkommen.

            Außerdem muß nicht das erste > dasjenige sein, welches das tag beendet.

            <img src="PfeilNachRechts.png" alt="-->" width="20" height="10">

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            Schreinerei Waechter
            Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.