Chrisi: Regex Problemchen ...

Hallo zusammen,

ich grübel jetzt schon etwas länger komme aber selber nicht dahinter:

'/(&)(?!amp;)/i'

Soweit so gut, ich möchte in einem String einfach alle & gegen & austauschen, aber immer nur dann wenn das & nicht von amp; gefolgt wird :-)

Ich verstehe aber nicht wie ich es hinbekomme einen Startwert und Endwert zu setzen. Im Klartext ich möchte nur die & zwischen <p></p> ersetzen.

Kann mir da jemand beistehen ?

Danke und Grüße

Chrisi

  1. Hi,

    Im Klartext ich möchte nur die & zwischen <p></p> ersetzen.

    Regular Expressions sind nicht in der Lage, Strukturen zu analysieren.

    Kann mir da jemand beistehen ?

    Erarbeite einen Algorithmus außerhalb der RegExp.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      danke für deine Info. Ich möchte nur ungern vor dem Regexen den String zerlegen oder anderweitig parsen. Habe mir nocheinmal überlegt warum es genau geht und dabe eine andere theoretische Möglichkeit gefunden.

      Mein Problem ist einfach das hin und wieder im HTML Code Javascript auftaucht, dieses enthält unter umständen den Operator &&, wenn ich jetzt meine Regex darüber gebe wird aus diesem natürlich ein &&amp;.

      Da habe ich mir überlegt einfach alle && vom Regexen auszuschliessen, also alle & die direkt drauf wieder von einem & verfolgt werden :-)

      Meine Regex:

      /(&)(?!&&)(?!amp;)/i'

      Sieht für mich logisch aus, klappt aber nicht :-) Er ersetzt mir noch immer das & hinter einem & ...

      Vielleicht kann mmir da jemand auf die Sprünge helfen ?

      Grüße

      Chrisi

      1. Hi Chrisi,

        Mein Problem ist einfach das hin und wieder im HTML Code Javascript auftaucht, dieses enthält unter umständen den Operator &&, wenn ich jetzt meine Regex darüber gebe wird aus diesem natürlich ein &&amp;.

        Da habe ich mir überlegt einfach alle && vom Regexen auszuschliessen, also alle & die direkt drauf wieder von einem & verfolgt werden :-)

        Meine Regex:

        /(&)(?!&&)(?!amp;)/i'

        Sieht für mich logisch aus, klappt aber nicht :-) Er ersetzt mir noch immer das & hinter einem & ...

        Vielleicht kann mmir da jemand auf die Sprünge helfen ?

        Du benutzt PHP? Wie machst du die Ersetzung? Mit preg_replace()? Mit dem PCRE alleine ersetzt du ja noch nichts. Eine Lösung wäre, mit preg_match_all() nach '/&(&)?/' zu suchen und nur die gefundenen Teil-Strings zu ersetzen, die nicht auf den Ausdruck in der Klammer "matchen". Ein anderer Weg wäre eventuell, sich mal mit dem Suchmustermodifikator "/e" auseinanderzusetzen. Der erlaubt es nämlich, dass sich im "Ersetzen"-String von preg_replace() auch PHP-Code befinden darf. Dieser könnte dann das Ersetzen abhängig vom zusätzlichen "&" vornehmen.

        MffG
        EisFuX

        --
        ... Suchmaschinen-Blog ...
      2. gudn tach!

        /(&)(?!&&)(?!amp;)/i'

        Sieht für mich logisch aus, klappt aber nicht :-) Er ersetzt mir noch immer das & hinter einem & ...

        /(&)(?!&&)(?!amp;)/ ist das gleiche wie
        /(&)(?!&&|amp;)/
        und das sucht nach allen '&', hinter denen weder '&&' noch 'amp;' steht.
        also '&&&' und '&amp;' werden nicht gematcht.

        die naechste idee waere also wohl
        /(&)(?!&|amp;)/

        aaber, das matcht z.b. in "a && b" das zweite "&", weil da ja kein "&" (und auch kein "amp;") dahinter steht.

        es gaebe da eine andere moeglichkeit, die allerdings nur dann funktioniert, wenn die javascript-code-teile mit <!-- und --> eingeklammert werden und wenn im js-code keine vergleiche gemacht werden, d.h. keine "<" und ">" auftauchen.
        sie basiert auf dieser idee aus den php-faq.

        preg_replace("/((<[^>]*)|&(?!amp;))/ie", '"\2"=="\1"? "\1":"\1amp;"', $html);

        <[^>]*    matcht auf alles, was mit "<" beginnt und kein ">" enthaelt, also z.b. '<a href="bla.php?foo=bar&bar=foo" class="foo"'.

        &(?!amp;) matcht auf ein "&", dem kein "amp;" folgt.

        ((<[^>]*)|&(?!amp;)) ist \2
         ^^^^^^^^
          ist \1

        man koennte nun noch versuchen durch weitere trickserei, vergleiche im js-code wieder zuzulassen, aber der code ist jetzt schon nicht besonders schnell und wuerde dadurch mit grosser wahrscheinlichkeit nur noch mehr verlangsamt und auch komplizierter zu lesen/warten.

        deswegen schlage ich vor, zu beginn den html-string mit gewoehnlichen string-funktionen zu zerlegen und erst dann mit preg_replace('\&(?!amp;)\', '&amp;', $html) oder, falls es deine anforderungen erlauben, mit htmlentities oder htmlspecialchars zu arbeiten.

        prost
        seth

  2. gudn tach!

    Soweit so gut, ich möchte in einem String einfach alle & gegen &amp; austauschen, aber immer nur dann wenn das & nicht von amp; gefolgt wird :-)

    [...] ich möchte nur die & zwischen <p></p> ersetzen.

    da regulaere ausdruecke nicht in allen sprachen gleichbehandelt werden, waere eben diese angabe noch hilfreich. php?

    ein anderer und evtl. auch besserer ansatz waere, wie Cheatah bereits sagte, einer ganz oder fast ohne regexps: zwei mal splitten (bei <p> und bei </p>) und anschliessend bei den "richtigen" teilen die ersetzung durchfuehren.

    prost
    seth

    1. Hi,

      ... eben diese angabe noch hilfreich. php?

      jepp, ich baue mit php.

      Grüße

      Chrisi