Zappda: Regex Hilfe

Hi,

ich habe ein Problem mit einem Regex in JS. Ich möchte einen Text ersetzen, der über mehrere Zeilen geht, zB diesen HTML-Code:

<style type="text/css">
 <!--
  @page { size: 21cm 29.7cm; margin: 2cm }
  P { margin-bottom: 0.21cm }
  H2 { margin-bottom: 0.21cm }
 -->
 </style>

Das habe ich in JavaScript mit folgendem Regex und vielen anderen versucht: text.replace(/<style[^>]*>[.\d\w\r\n]*/gi, 'asd');
Doch leider ersetzt er mir nur den Anfangs-Tag mit einem Zeilenumbruch.

Was mach ich falsch? Ich möchte gerne den gesamten Inhalt zwischen <style und </style> löschen.

Gruss
Zappda

  1. @@Zappda:

    Was mach ich falsch? Ich möchte gerne den gesamten Inhalt zwischen <style und </style> löschen.

    Und worum willst du dafür einen regulären Ausdruck einsetzen?

    document.getElementsByTagName("style")[0].innerHTML = ""; sollte es doch viel effizienter tun.

    Oder per DOM das 'style'-Element ganz löschen.

    Live long and prosper,
    Gunnar

    --
    „Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann.“ (Joseph Weizenbaum)
    1. ^^Der HTML-Code steht in einer Text-Area und gehört nicht zum Dokument an sich ;)

  2. gudn tach!

    <style type="text/css">
    <!--
      @page { size: 21cm 29.7cm; margin: 2cm }
      P { margin-bottom: 0.21cm }
      H2 { margin-bottom: 0.21cm }
    -->
    </style>

    Das habe ich in JavaScript mit folgendem Regex und vielen anderen versucht: text.replace(/<style[^>]*>[.\d\w\r\n]*/gi, 'asd');

    der teil
      <style[^>]*>
    matcht
      <style type="text/css">

    und der teil
      [.\d\w\r\n]*
    matcht den darauffolgenden zeilenumbruch.

    Was mach ich falsch?

    der punkt hat innerhalb einer zeichenklassendefinition seine literale bedeutung, d.h. er matcht tatsaechlich nur einen punkt.

    Ich möchte gerne den gesamten Inhalt zwischen <style und </style> löschen.

    eine moeglichkeit:
    text.replace(/(<style[^>]*>)(?:.|[\r\n])*?(</style>)/gi, '$1asd$2');

    im javascript-code, darf nun aber nirgends "</style>" vorkommen...

    mit lookbehind- und lookahead-assertions waeren auch noch andere moeglichkeiten denkbar, aber javascript kennt afaik standardmaessig kein lookbehind.

    prost
    seth

    1. Thx, funzt einwandfrei.

      Kannst du mir den Part (?:.|[\r\n])*?  erklären?
      Also in der Klammer steht ja "entweder jedes Zeichen" oder "Zeilenumbruch".
      Aber was bedeutet das "?:" davor und das Fragezeichen am Ende?

      Gruss
      Zappda

      1. @@Zappda:

        Kannst du mir den Part (?:.|[\r\n])*?  erklären?

        SELFHTML kann.

        Aber was bedeutet das "?:" davor

        http://de.selfhtml.org/perl/sprache/regexpr.htm#rangfolge

        und das Fragezeichen am Ende?

        http://de.selfhtml.org/perl/sprache/regexpr.htm#gierig_genuegsam

        Live long and prosper,
        Gunnar

        --
        „Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann.“ (Joseph Weizenbaum)
    2. Hi,

      text.replace(/(<style[^>]*>)(?:.|[\r\n])*?(</style>)/gi, '$1asd$2');

      Kennt javascript kein s-Flag?
      Damit würde (?:.|[\r\n]) auf . schrumpfen.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. gudn tach!

        text.replace(/(<style[^>]*>)(?:.|[\r\n])*?(</style>)/gi, '$1asd$2');

        Kennt javascript kein s-Flag?
        Damit würde (?:.|[\r\n]) auf . schrumpfen.

        zumindest in den ecma262-spezifikationen (von 1999, krass!) habe ich nur i-, m- und g-modifier gefunden und den ausdruecklichen hinweis, dass nur diese drei erlaubt sind. ich weiss allerdings nicht, wie massgeblich dieses dokument ist.

        prost
        seth