Science: preg_replace

Hallo @ all,

Ich würde gerne zwischen den Pre Tags die zusätslichen Html-Tags für zeilenumbrüche (<br />) herauslöschen, was ich wie folgt angegangen bin:

$search = array( "/((<pre>[^</pre>]*)|<br />)/e" );
$replace = array( '"\2"=="\1"? "\1":" "' );
$text = preg_replace ($search, $replace, $text);

Das funktioniert allerdings noch nicht so ganz, könnt ihr mir weiterhelfen?

mfg Science

  1. Hallo Science,

    $search = array( "/((<pre>[^</pre>]*)|<br />)/e" );
    Das funktioniert allerdings noch nicht so ganz, könnt ihr mir weiterhelfen?

    [^ab] heißt alles außer a ODER b, jedoch nicht alles außer ab. Daher:

    $search = array("/((<pre>.*?</pre>)|<br />)/e");

    Das ? aus .*? ist hier erklärt: http://www.dclp-faq.de/q/q-regexp-gierig.html Das /-Zeichen musst Du "escapen", (d.h. ein \ voranstellen) weil Du das als Trennzeichen für Deinen regulären Ausdruck verwendet hast.

    Viele Grüße,
    Christian

    --
    | http://www.selflinux.org/                                                  |
    | http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm                      |
    | sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[ |
    | http://emmanuel.dammerer.at/selfcode.html                                  |
    1. Hallo Christian,

      Danke, jetzt funktioniert es - fast.
      Es war wohl mein anfänglicher Fehler, doch eigentlich wollte ich string $s
      $search = array("/((<pre>.*?</pre>)|$s)/e");
      innerhalb von <pre></pre> ersetsen, damit es keine doppelten zeilenumbrüche gibt...
      Was muss ich dafür ändern?

      mit freundlichen grüßen und hoffnung auf baldige Antwort: Science

      1. Hallo Science,

        Danke, jetzt funktioniert es - fast.
        Es war wohl mein anfänglicher Fehler, doch eigentlich wollte ich string $s
        $search = array("/((<pre>.*?</pre>)|$s)/e");
        innerhalb von <pre></pre> ersetsen, damit es keine doppelten zeilenumbrüche gibt...
        Was muss ich dafür ändern?

        Was steht in $s?

        Viele Grüße,
        Christian

        --
        | http://www.selflinux.org/                                                  |
        | http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm                      |
        | sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[ |
        | http://emmanuel.dammerer.at/selfcode.html                                  |
        1. Hallo Christian,

          In $s steht <br />.

          mfg Science

          1. Hallo Science,

            In $s steht <br />.

            Na dann ist ja klar - / ist das Trennzeichen für Deinen Ausdruck und deswegen muss es maskiert werden. Entweder Du sorgst dafür, dass in $s <br /> steht, oder Du änderst das Trennzeichen für Deinen Ausdruck.

            Viele Grüße,
            Christian

            --
            | http://www.selflinux.org/                                                  |
            | http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm                      |
            | sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[ |
            | http://emmanuel.dammerer.at/selfcode.html                                  |
            1. Christian

              Nein, das meine ich nicht, soweit funktioniert es schon, doch die entsprechende Funktion ersetzt natürlich außerhalb von <pre></pre> die Zeilenumbrüche, ich würde sie allerdings doch lieber innerhalb ersetzten, da diese dort sonst doppelt stehen.

              Bis jetzt habe ich:
              $s in $t durch $r ersetzen, außerhalb von $1 und $2:
              preg_replace("/(($1.*?$2)|$s)/e", '"\2"=="\1"? "\1":"$r"', $t);

              Ich weiß allerdings nicht genau, wie ich die Zeile(n) umschreiben muss, damit die Zeilenumbrüche innerhalb der beiden Tags ersetst werden!?

              mgf Science

              1. Hallo Science,

                Nein, das meine ich nicht, soweit funktioniert es schon, doch die entsprechende Funktion ersetzt natürlich außerhalb von <pre></pre> die Zeilenumbrüche, ich würde sie allerdings doch lieber innerhalb ersetzten, da diese dort sonst doppelt stehen.

                Ach so meinst Du das... Hmmmm.

                Ich weiß allerdings nicht genau, wie ich die Zeile(n) umschreiben muss, damit die Zeilenumbrüche innerhalb der beiden Tags ersetst werden!?

                Dann musst Du einen völlig anderen Ansatz wählen:

                $start = '<pre>';
                $ende = '</pre>';
                $s = '<br />';
                $r = '';

                $text2 = preg_replace ("/$start.*?$ende/ie", "str_replace ('$s', '$r', '$0')", $text1);

                (oder innerhalb auch preg_replace, wenn es komplexer wird)

                Viele Grüße,
                Christian

                --
                | http://www.selflinux.org/                                                  |
                | http://aktuell.de.selfhtml.org/tippstricks/beitrag.htm                      |
                | sh:) fo:) ch:] rl:( br:> n4:& ie:% mo:) va:) de:] zu:) fl:( js:| ss:) ls:[ |
                | http://emmanuel.dammerer.at/selfcode.html                                  |
                1. Hallo Christian,

                  Danke für die mühe, jetzt funktioniert alles.

                  mfg Science