[REGEX] <br> Tags zwischen <pre></pre> in \n umwandeln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [REGEX] <br> Tags zwischen <pre></pre> in \n umwandeln

    Hi,

    Ich hab jetzt folgende 2 Regexe:

    preg_replace('<br(>|([\s/][^>]*)>)\r?\n?)=i','\n',$str) ( umkehrfunktion von br2nl())

    und

    $str = preg_replace('=(<pre>)(.*)(</pre>)=Uis',''',$str); (Text zwischen <pre></pre> zu finden).

    Wie kann ich diese 2 Regexe jetzt zusammenpflanzen, dass der Text zwischen den <pre>Tags von <br> gesäubert wird und stattdessen \n eingefügt wird?

    Schon mal Danke im voraus.

    Greetz
    Hessel

  • #2
    hmm,

    was hast du den bisher versucht?

    wenn wir von syntaktisch korrektem html ausgehen, such einfach nach einem <br />, welches von `nem schließenden </pre> gefolgt wird.

    => manual => pcre => assertion: ... matches a dingens followed by a dingens ...

    oder verwende eine callback-funktion, entweder über preg_replace_callback oder preg_replace, und wende dann die br-sache auf den inhalt der tags an.
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      Naja, Problem ist, ich hab nicht sehr viel Ahnung von Reguläre Ausdrücke.

      Aber es soll in etwa so funktionieren:

      $str = preg_replace('(<pre>)(.*)(</pre>)#Uis', '',$str);

      Also mit dem Regex, holt der Sich ja den Text zwischen den <pre> Tags. Nur wie wende ich jetzt meinen Regex um die <br> in \n umzuwandeln auf den (.*)-Teil an?

      H-T

      Kommentar


      • #4
        $str = preg_replace("/(?<=<pre>)(.*?)<br>(.*?)(?=<\/pre>)/is","$1\n$2",$str);

        Kommentar


        • #5
          Milian der Regex funktioniert leider nicht

          Kommentar


          • #6
            hmm, stimmt. So würde es gehen, find ich aber komisch die Lösung:
            PHP-Code:
            $text 'Text<br />Text Text
            <pre>
            Text<br />Text<br />Text
            </pre>
            Text Text<br />Text'
            ;
            while (
            preg_match('/<pre>(.*?)<br \/>(.*?)<\/pre>/is',$text)) {
                
            $text preg_replace('/(<pre>.*?)<br \/>(.*?<\/pre>)/is',"$1\n$2",$text);
            }
            echo 
            $text
            Output:
            Code:
            Text<br />Text Text
            <pre>
            Text
            Text
            Text
            </pre>
            Text Text<br />Text
            Ich hab's nich hinbekommen mit einem Pattern alle <br /> zwischen den <pre>'s zu entfernen...

            Kommentar


            • #7
              Milian, deine Lösung funktioniert. Bissel unschön ist es, aber solange es funktioniert . Vielleicht gibts hier ja noch einen, der das in eine Zeile umändern kann den Code.

              Aber danke!!

              H-T

              Kommentar


              • #8
                Code:
                  $text = '
                    Text<br />Text Text
                    <pre>
                    Text<br />Text<br />Text
                    </pre>
                    Text Text<br />Text
                  ';
                  
                  echo preg_replace('#<pre>(.*)</pre>#Uise', "'<pre>'.preg_replace('#<br />#', \"\\r\\n\", '\\1').'</pre>'", $text);
                Die Zeit hat ihre Kinder längst gefressen

                Kommentar


                • #9
                  Hey Danke! Funktioniert! Das einfügen von \n war aber überflüßig. Naja es funktioniert. Sehr schön.


                  Super Dankeschön!!!!!!!

                  Greetz
                  Hessel

                  Kommentar


                  • #10
                    Hi,

                    ich hab mal versucht den Regex von derHund auf einen weiteren preg_replace zu übertragen und zwar:

                    $text = '[liste=disk]
                    [p]Listenpunkt 1[/p]
                    [p]Listenpunkt 2[/p][/list]

                    echo preg_replace('#\[list=(.*)\](.*)\[/list\]#Uise', "'<ul style=\"list-style-type:$1;\">'.preg_replace('=\\[p\\][COLOR=red](.*)[/COLOR] \\[/p\\]=Uis','<li>[COLOR=red]$2[/COLOR] </li>','$2').'</ul>'", $text);

                    Ausgabe:

                    <ul style="list-style-type:disk;">
                    <li>[p]test[/p][p]blup[/p]</li>
                    <li>[p]test[/p][p]blup[/p]</li>
                    </ul>

                    Wie kann ich auf den Subpattern vom rot markierten Teil zugreifen? Wird ja fast alles richtig dargestellt. Nur der Inhalt von den Listen nicht .

                    PS.: Sry Doppelpost, aber ich wollte keinen neuen Thread eröffnen.

                    Wäre für Hilfe sehr dankbar

                    Greetz
                    Hessel

                    Kommentar


                    • #11
                      verwende lieber preg_replace_callback. du ersparst dir bei komplexeren sachen die fummelei mit dem modifier e.

                      ansonsten empfehle ich dir, erst beide replace einzeln zum laufen zu bekommen, und sie dann zu kombinieren.

                      nein, eigentlich empfehle ich callback ...
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        HI,

                        Also preg_replace_callback hatte ich auch schon gesehen und gelesen. Habs jetzt nach deinem Post noch einpaar mal gelesen, aber wie ich das jetzt auf meinen Regex anwenden kann ist mir noch undeutlich.

                        Also die subpattern müssen in ein Array gespeichert werden und das ist dann der Callback?

                        Hmm....hilfe hierbei wäre super

                        Greetz
                        Hessel

                        Kommentar


                        • #13
                          bei verwendung der funktion wird als ersatzstring die rückgabe einer funktion, der (automatisch) die subpattern übergeben werden, verwendet ...

                          durch schrittweises vorgehen kann man soetwas selbst herausfinden, naja ...
                          Code:
                            $text = '
                              [trist=disk]
                                [p]Listenpunkt 1[/p]
                                [p]Listenpunkt 2[/p][/list]
                            ';
                          
                            function call_me_back($sub) {
                              $return = '
                                <ul style="list-style-type:'.$sub[1].'">
                              ';
                              $return .= preg_replace('#\[p\](.*)\[/p\]#', '<li>\1</li>', $sub[2]);
                              $return .= '
                                </ul>
                              ';
                              return $return;
                            }
                            
                            echo preg_replace_callback('#\[list=(.*)\](.*)\[/list\]#iUs', 'call_me_back', $text);
                          Die Zeit hat ihre Kinder längst gefressen

                          Kommentar

                          Lädt...
                          X