nochmals preg_replace

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

  • nochmals preg_replace

    Hallo Zusammen

    Sorry bin heute gut in Fahrt
    Eine Frage hätte ich zu Preg_replace. Bei meinen Terminen habe ich einen preg_replace.
    Der Pattern für das vorwort ist wie folgt:
    (?<=\()){$variable
    Hier beachtet er mri nun auch wenn ein Wort nach einer ( kommt. Soweit so gut.
    Gibt es nun eine möglichkeit ihm zusagen er soll es nicht nur ersetzen wenn es nach den definierten zeichen und ( kommt, sondern auch nach sowas? [ABC1]

    EDIT: Hätte da noch eine Frage. Kann man auch ein regex erstellen was er ausschliessen soll?
    Also z.B. das man sagt wenn folgendes NACH dem wort kommt soll er es nicht ersetzen? " [/ABC2]"(mit dem leerschlag vor [) oder auch ohne leerschlag?
    Sorry und das ähnliche andersrum. Also wenn exakt vor dem wort oder vor dem wort mit einem leerschlag dazwischen folgendes wäre: [ABC2] oder das selbe mit [ABC2=...] )Hier soll er nicht beachten was nach diesem = kommt.

    Über Hilfestellung würde ich mich freuen.

    Gruss

    Katharina

  • #2
    pauschal kann ich dir sagen, es ist eigentlich alles machbar.

    du solltest aber eventuell erst mal sinn und ordnung in deinen beitag bringen, damit man auch versteht, was du möchtest.

    es wäre schön, wenn klar erkennbar wäre, was du unter welchen bedingungen ersetzt haben möchtest, und wann du nicht ersetzen möchtest.
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      Hallo der Hund

      Das tut mir leid sorry. Ich probiere es mal so da ein grossteil der obenren Frage konnte ich bereits lösen:

      Ich erstelle gerade einen Termin Kalender mit den BBCodes oder wie die genau heissen.
      Ich benötige im Terminkalender eine Ersatzliste. Also eine Liste wo Wörter drin stehen sollen die automatisch ersetzt werden sollen. Dies hat soweit auch funktioniert.
      Ich würde gerne bei einem Regex etwas verbieten.
      Der Aufbau vom Suchstring ist ja wie folgt:
      SuchRegex$variableFuersWordWeitererRegex
      Mit folgender Erweiterung meines bisherigen Regex |(?<=\]) sage ich ihm ja das er mir das Wort ersetzen soll wenn ein ] vor dem Wort steht. Nun würde ich gerne dies erweitern, dass wenn vor dem Suchwort zwar die gesuchten dinge wie eben |(?<=\]) vorhanden sind ABER entweder:
      - [AURL]
      - [AURL=...]
      - oder dahinter [/AURL]
      vorkommen, dass er es dann nicht ersetzt. Aus soll er dies nicht ersetzen wenn zwischen diesen drei punkten und dem Wort ein oder zwei Leerschläge sind.

      Ich hoffe ihr versteht was ich meine und könnt mir weiterhelfen.

      Ein weiteres Problem wo ich hoffe ihr könnt mir helfen hängt mit dem selben zusammen:
      Wenn dies mit der AURL vorkommt soll er es nicht ersetzen. (Ist etwas schwer zu erklären)
      Sagen wir das gesuchte Wort ist "Hallo".
      Nun haben wir Folgendes.
      Dies ist ein Satz mit hallo und vielleicht auch mehr.
      Dann soll er dies ersetzen (macht er bisher auch).
      JEDOCH wenn dies vorkommt soll er es nicht ersetzen (Ich weiss nicht ob es geht. Aber ich hoffe es mal)
      [AURL=...]Irgend ein Satz wo Hallo vorkommt[/AURL]
      Denn sonst würde er mir aus hallo einen Link machen und aus dem AURL auch. Und dies möchte ich dass er dann den Link macht aber aus dem Hallo keinen.

      Über Hilfe würde ich mich freuen.

      Gruss

      Katharina

      Kommentar


      • #4
        mach dich mal schlau zum thema "backreferences".
        Die kannst bei der Ersetzung als Variablen nutzen....

        z.B.:

        PHP-Code:
        $s "[aurl=irgendeinlink.htm]linkbezeichner[/aurl]";

        echo 
        preg_replace("#\[aurl=(.*?)](.*?)\[/aurl\]#im","<a href=\"$1\">$2</a>",$s); 
        Diejenigen Treffer, die in () stehen, kannst du innerhalb deiner regex pattern als Variable nutzen und auch in der Ersetzung.

        dann brauchst auch keine lookahead oder lookbehind assertions.

        Kommentar


        • #5
          Original geschrieben von ankh
          mach dich mal schlau zum thema "backreferences".
          Die kannst bei der Ersetzung als Variablen nutzen....

          z.B.:

          PHP-Code:
          $s "[aurl=irgendeinlink.htm]linkbezeichner[/aurl]";

          echo 
          preg_replace("#\[aurl=(.*?)](.*?)\[/aurl\]#im","<a href=\"$1\">$2</a>",$s); 
          Diejenigen Treffer, die in () stehen, kannst du innerhalb deiner regex pattern als Variable nutzen und auch in der Ersetzung.

          dann brauchst auch keine lookahead oder lookbehind assertions.
          Guten Morgen

          Sorry aber ich verstehe nicht ganz was dies mit meinem Problem zu tun hat. Keiner von den Pattern sagt doch er soll das wort nur ersetzen wenn eines der ovbengenanten dinge vorne oder hinter dem wort kommt oder?

          Ich habe ja sowas wie das was du mri gepostet hast: "/(?<!\S){$quiz_row['firstq_title']}(?!\S)/i" und dies möchte ich mit den Kritierien erweitern.

          Gruss

          Katharina

          Kommentar


          • #6
            axo, das gehört zusammen...

            dann fassen wir doch mal zusammen:

            du möchtest:
            [list=a]
            - einzelworte farbig formatieren
            - wortgruppen, die auch o.g. einzelworte enthalten können farbig formatiern, wobei die einzelwortfärbung nicht greifen darf.
            - bbtags in htmltags umsetzen[/list=a]

            Wär gut zu wissen, was alles mit dem text passieren soll, damit man da auch sinnvolle regex patterns bauen kann, die in kombination gut funktionieren können.

            Quasi ganzheitlich und nicht symptomatisch vorgehen, wie der mediziner sagen würde.

            Kommentar


            • #7
              Hallo

              Ne gehört nicht zusammen Ich konnte nur grad diesen Pattern gebrauchen

              Also ich möchte eigentlich nur noch das beschriebene. Also das er die wörter so ersetzt, AUSSER wenn eben eines dieser "BBCOdes" vorkommt" vorne oder am schluss wie oben beschrieben (im dritten Beitrag)

              Gruss

              Katharina

              Kommentar


              • #8
                was du dann mal ausprobieren kannst wäre, mittels striptags() die formatierungs Tags aus der Backreference (s.o.) rauszuschmeißen...

                weiß allerdings net ob das klappt...

                Kommentar


                • #9
                  Original geschrieben von ankh
                  was du dann mal ausprobieren kannst wäre, mittels striptags() die formatierungs Tags aus der Backreference (s.o.) rauszuschmeißen...

                  weiß allerdings net ob das klappt...
                  Hmm muss wirklich zugeben ich wüsste nicht wie dies klappt. Müsste dies nicht direkt sogar im pattern funktionieren irgendwie?

                  Gruss

                  Katharina

                  Kommentar


                  • #10
                    huhu kathi

                    ich mein des ungefähr so:

                    PHP-Code:
                    echo preg_replace("#[aurl=(.*?)](.*?)[/aurl]#im","<a href=\"$1\">".strip_tags($2)."</a>",$s); 
                    wie gesagt, weiß net ob man die Backreference an 'ne funktion übergeben kann, aber das wär die einfachste Lösung.

                    Kommentar


                    • #11
                      Guten Abend

                      Ups sorry ich denke du hast mich falsch verstanden.
                      Hoffe ich beschreibe es nicht zu komplex.

                      Ich möchte nicht das mit dem AURL ersetzen.
                      Ich habe ja durch deine nette Hilfe im anderen thread diesen pattern Teil:
                      (?<=\])){$variable
                      Wenn nun nach einem Wort Hallo gesucht wurd, wird ]Hallo auch ersetzt.
                      Dies ist auch super so. Nun kann jedoch folgendes vorkommen (NUR BEI AURL so
                      - [AURL=...]SUCHWORT[/AURL] (Das selbe aber auch mit einem oder ggf auch zwei (je nach dem wie blöd der user ist lol) leerzeichen drin. Nun soll er SOBALD es sich um AURL handelt, trotz das eine ] vor dem Wort ist das ganze nicht ersetzen.
                      Falls da nicht nur ein Suchwort zwischen den beiden "BBCodes" ist, sondern ggf ein Satz der als Link sein soll, Möchte ich dies einfach getrennt, also wenn vorne dran [AURL=...] vorkommt oder hinten [/AURL].
                      Hier kann ich mir vorstellen, da das ... nicht zu beachten ist (hier käme der link rein). Also das man eher auf [/AURL] schauen würde.

                      Hoffe ich konnte es so etwas besser erklären.

                      Gruss

                      Katharina

                      Kommentar


                      • #12
                        wie gesagt, weiß net ob man die Backreference an 'ne funktion übergeben kann, aber das wär die einfachste Lösung.
                        so geht das nicht, du würdest dann strip_tags auf das literal $2 anwenden, nicht auf die backreference. wenn so, dann mußt du modifier e verwenden und den string entsprechend anpassen.
                        JEDOCH wenn dies vorkommt soll er es nicht ersetzen (Ich weiss nicht ob es geht. Aber ich hoffe es mal)
                        wenn du bestimmte worte ersetzen willst, innerhalb von bestimmten bb-tags aber nicht, nimmst du eine assertion ....

                        ersetze hallo nur, wenn dahinter kein schließender tag kommt, vor dem kein öffnender tag kommt ...

                        hab leider jetzt keine zeit (lust^^), vielleicht morgen ...
                        Die Zeit hat ihre Kinder längst gefressen

                        Kommentar


                        • #13
                          Original geschrieben von derHund
                          so geht das nicht, du würdest dann strip_tags auf das literal $2 anwenden, nicht auf die backreference. wenn so, dann mußt du modifier e verwenden und den string entsprechend anpassen.
                          wenn du bestimmte worte ersetzen willst, innerhalb von bestimmten bb-tags aber nicht, nimmst du eine assertion ....

                          ersetze hallo nur, wenn dahinter kein schließender tag kommt, vor dem kein öffnender tag kommt ...

                          hab leider jetzt keine zeit (lust^^), vielleicht morgen ...
                          Hallo

                          Das wäre super wenn du morgen Zeit hast. Es soll ja auch nur bei AURL sein. Wenn es nicht mit einem satz geht zwischen den tags sondern nur grad mti dem Wort ist auch nicht so schlimm hauptsache geht es dann. Wäre wirklich toll, da ich nicht weiss wie ich diesen teil umsetzen könnte.
                          Den suchpattern wie er jetzt ist möchte ich nciht mehr gross ändern da er wirklich schön alles ersetzt was er soll.

                          Gruss

                          Katharina

                          Kommentar


                          • #14
                            'nabend kathi

                            also du möchtest, dass alles innerhalb von [AURL]...[/AURL] unangetastet bleibt...

                            da hab ich doch glaub ich'n codeschnipsel, der da helfen könnte:

                            PHP-Code:
                            $li = array();
                                        
                            preg_match_all("~<a.*?</a>~i",$element,$li);        
                                        foreach(
                            $li[0] as $k => $v){
                                            
                            $element = @preg_replace ("~".addslashes($v)."~","##$k",$element);
                                        }

                            /*
                             hier alles andere preg_replace()n....
                             und was sonst noch so zu ersetzen ist
                            */

                                        
                            foreach($li[0] as $k => $v){
                                             
                            $element = @preg_replace ("~##$k~","$v",$element);
                                        } 
                            Damit kannst dir die inhalte eines Tags aus der preg_replace() parade wegsichern, und sie nachher wohlbehütet wieder einfügen.

                            musst halt noch guggn, dass du dir die <a> tags durch [AURL] tags ersetzt und andersherum...

                            edit:
                            @derHund: stimmt, mir war so, als wär hätt ich das schonmal erfolglos probiert....
                            Zuletzt geändert von ankh; 24.05.2005, 22:06.

                            Kommentar


                            • #15
                              Original geschrieben von ankh
                              'nabend kathi

                              also du möchtest, dass alles innerhalb von [AURL]...[/AURL] unangetastet bleibt...

                              da hab ich doch glaub ich'n codeschnipsel, der da helfen könnte:

                              PHP-Code:
                              $li = array();
                                          
                              preg_match_all("~<a.*?</a>~i",$element,$li);        
                                          foreach(
                              $li[0] as $k => $v){
                                              
                              $element = @preg_replace ("~".addslashes($v)."~","##$k",$element);
                                          }

                              /*
                               hier alles andere preg_replace()n....
                               und was sonst noch so zu ersetzen ist
                              */

                                          
                              foreach($li[0] as $k => $v){
                                               
                              $element = @preg_replace ("~##$k~","$v",$element);
                                          } 
                              Damit kannst dir die inhalte eines Tags aus der preg_replace() parade wegsichern, und sie nachher wohlbehütet wieder einfügen.

                              musst halt noch guggn, dass du dir die <a> tags durch [AURL] tags ersetzt und andersherum...

                              edit:
                              @derHund: stimmt, mir war so, als wär hätt ich das schonmal erfolglos probiert....
                              Guten Abend

                              Danke nochmals für deine Antwort.
                              Dazu hätte ich jedoch zwei Fragen:
                              1. gibt es da nicht eine möglichkeit mit einem preg? Dies benötigt ja doch eine enorme seitenladezeit zum Teil.
                              2. Warum muss ich denn alle <a> umwandeln?
                              Der Code wird ja so eingegeben: [AURL=URL] hallo [/AURL]. Also ohne <a> oder so. Und ich möchte einfach erreichen wenn direkt danach das [/aurl] kommt das es dann nicht ersetzt wird trotz dem ] vorne weg. und eben wäre schön auch wenn nach dem wort ein oder zwei leerschläge kommen und dann [/AURL] das ers auch nicht ersetzt.
                              Ich gehe jetzt mal noch zu einer spätschicht. Schaue dann morgen früh wieder rein oder wenn es Zeitlich passt mal in der nacht ob noch jemand wach ist *g*

                              Gruss

                              Katharina

                              Kommentar

                              Lädt...
                              X