Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_replace einen String im needle ignorieren lassen...

Einklappen

Neue Werbung 2019

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

  • preg_replace einen String im needle ignorieren lassen...

    Hallo Leute,

    ich hab mal eine Frage: Kann man preg_replace() sagen, dass es einen (oder mehrere) spezifische Strings im Pattern ignorieren soll, so dass die Ersetzung trotzdem passiert?

    Beispiel:
    Nehmen wir an ich will immer "Apfelkuchen" ersetzen im String, egal ob dort steht "Apfel<span class="cooler_text">sahne</span>kuchen", "Apfelkuchen" oder "A<span class="cooler_text">sahne</span>pfelkuchen.

    Es soll dann eben nicht nur "Apfelkuchen" ersetzt werden sondern eben auch diese Varianten (mit den <span>s als Beispiel).

    Beispiel-Text:
    Code:
    Apfelkuchen ist lecker. Apfel<span class="cooler_text">sahne</span>kuchen ist noch ein bißchen netter.
    Rauskommen soll also sowas:
    Code:
    <strong>Apfelkuchen</strong> ist lecker. <strong>Apfel<span class="cooler_text">sahne</span>kuchen</strong> ist noch ein bißchen netter.
    Geht sowas und wenn ja hat jemand ein Beispiel? Interessant daran ist eben, dass an jeder beliebigen Stelle meines Suchstrings ein Text stehen kann(!). Den Text kenne ich (also z.B. immer <span class="cooler_text">sahne</span>).

    Muss ich da jetzt sowas suchen wie:
    Code:
    %A(.*)p(.*)f(.*)e(.*)l(.*)k(.*)u(.*)c(.*)h(.*)e(.*)n%
    oder geht das spezifischer / eleganter?

    Viele Grüße und vielen Dank für Eure Antworten .
    *Fuchur*


  • #2
    Nein, das ist nicht mit RegExp zu lösen, es sei denn du könntest exakt die Regeln bestimmen, wonach du suchst und was "dazwischen" stehen darf (was du ja offensichtlich eben nicht kannst).

    Wo der String "Apfelkuchen" getrennt wird und was dazwischen liegt, ist unbekannt bzw. beliebig.
    Ich würde behaupten, das du in jeder x-beliebigen HTML Seite die etwas textlastiger ist, die Buchstaben finden wirst, die "Apfelkuchen" ergeben, irgendwo verteilt im HTML.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Nicht so einfach aber möglich.

      Mit RegExp erstmal, da dir ja <span class="cooler_text"> usw. bekannt ist, erst mal ein Array erstellen.

      Dann tatsächlich, so dumm wie es klingt, die Results via strreplace austauschen.

      Allerdings hast du somit nur das Problem zwischen den "cooler_text"> gelöst.

      Du möchtest aber den kompletten Satz ändern (<strong> usw. einbauen)

      Also bleibt dir keine andere Möglichkeit, als den String komplett zu zerlegen und nacher wieder zusammenzubauen.

      Ich will nix versprechen, aber ich habe sowas ähnliches mal gemacht. Ich schau mal ob ich die Funktionen entsprechend umstricken kann und poste sie dann hier.

      Kommentar


      • #4
        Ich hab die REGEX rausgelassen, weil du die gar nicht brauchst und dir str_replace reicht, da dir ja die entsprechenden Ersetzer bekannt sind.

        Also so
        PHP-Code:
        function deinefunktion($str='',$strong='',$htmlstart='',$htmlend=''){
                
                
        $str=str_replace($strong,'<strong>'.$strong.'</strong>',$str);
                
        $a=array($htmlstart,$htmlend);
                
        $b=array('<strong>'.$htmlstart,$htmlend.'</strong>');
                return 
        str_replace($a,$b,$str);
                
        }
        $str='Apfelkuchen ist lecker. Apfel<span class="cooler_text">sahne</span>kuchen ist noch ein bißchen netter.';
        echo 
        deinefunktion($str,'Apfelkuchen','<span class="cooler_text">','</span>'); 
        Jetzt musst du das ganze nur noch so erweitern, dass "Apfel" für sich auch noch mal genutzt wird.

        EDIT:

        Ja stimmt nicht ganz. Der Kuchen soll ja auch Strong sein.

        Dann musst eben noch die Leerzeichen hinter </span> abfragen und das </strong> erst beim zweiten Leerzeichen setzen.

        Kommentar


        • #5
          Erweitert
          PHP-Code:
          function deinefunktion($str='',$strong='',$htmlstart='',$htmlend=''){
                  
                  
          $str=str_replace($strong,'<strong>'.$strong.'</strong>',$str);
                  
          $a=array($htmlstart,$htmlend);
                  
          $b=array('<strong>'.$htmlstart,$htmlend.'</strong>');
                  return 
          str_replace($a,$b,$str);
                  
          }
          $str='Apfelkuchen ist lecker. Apfel<span class="cooler_text">sahne</span>kuchen ist noch ein bißchen netter.';
          echo 
          deinefunktion($str,'Apfelkuchen','Apfel<span class="cooler_text">','</span>kuchen'); 
          So gehts natürlich auch und wirft dein gewüschtes Ergebnis deine Beispieles zurück.

          Die Werte für Apfel und Kuchen musst natürlich selbst ermitteln. Hierbei hilft dir RegEx aber. (Wird ja nicht immer Apfelkuchen sein.

          Das innherhalb den spans ist irrelevant.

          Kommentar


          • #6
            Das kannst du nicht mit einem Regulärenausdruck abdecken. (oder vielleicht nur sehr aufwendig)
            Du müsstest den Text eigentlich Wort für Wort durchgehen. (da fängts schon an, was ist ein Wort) Und dann für jedes Wort testen wieviel vom Suchwort auf den Anfang passen und ob der Rest aufs Ende passt. Wenns passt kannst da das Wort im Orginaltext ersetzen.

            Pseudocode:
            PHP-Code:
            $text 'blub di dub';
            $search_word '';

            $words splitTextInWords($text);
            $words array_unique($words);
            foreach(
            $words AS $word) {
               
            //wort kleiner als suchwort? kann nicht passen...
               
            if(strlen($word) < strlen($search_word)) {
                   continue;
               }

               
            //prüfen wieviel zeichen des suchworts auf den anfang von word passen
               
            for($pos 0;$pos <= strlen($search_word); $pos++) {
                  if(!
            strcmp($search_word[$pos], $word[$pos])) {
                     break;
                  }
               }

               if(
            $pos == 0) {
                     continue;
               }

               
            //prüfen ob der rest aufs ende des suchworts passt
               
            if(substr($search_word$pos) != substr($word, -$pos)) {
                      continue;
               } 
               
                
            //passt alles
                
            $text str_replace($word'<strong>'.$word.'</strong>'$text);
            }

            echo 
            $text

            Kommentar

            Lädt...
            X