Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Replace Count Parameter?!

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Replace Count Parameter?!

    Hallo zusammen,

    ich habe ein forum. Das Forum hat ein lexikon angegliedert. Wörter welche im lexikon vorkommen, werden im Forum durch einen Link zum lexikon ersetzt. Wenn aber in einem Text 10 mal ein Wort vorkommt, wird es auch 10mal durch einen Link ersetzt...ich hätte es aber gerne so, dass jedes Wort nur einmal ersetzt wird. Dazu müsste man doch den Count / Limit Parameter heranziehen können? hab php5!

    Ich habe diesen schon an alle stellen im folgenden Code platziert...trotzdem wird aber immernoch jedes Wort mehrmals verlinkt. Danke für Hilfe...wo würdet Ihr den Limit / Count parameter hinzufügen?

    PHP-Code:
    if (count($crosslink_word)) {
            
    $message str_replace('\"''"'substr(preg_replace('#(\µ(((?>([^µ§]+|(?R)))*)\§))#se'"preg_replace(\$crosslink_word, \$crosslink_url, '\\0')"'µ' $message '§'), 1, -1));
        } 


  • #2
    hab rausgefunden das ganze kann man auch verkürzen:

    PHP-Code:
    if (count($crosslink_word)) {
    $message=reg_replace($crosslink_word$crosslink_url$message1);

    aber es wird trotzdem mehrmals ersetzt...warum????

    Kommentar


    • #3
      Der 4. Parameter ist schon der Richtige. Aber reg_replace() gibt es nicht, vielleicht liegt es daran!?

      Kannst du uns sonst noch was zu deinem Code erzählen? Dein erster Versuch scheint mir irgendwie ... hmm ... falsch zu sein.

      Gruß
      http://hallophp.de

      Kommentar


      • #4
        Hallo,

        sorry, natürlich preg_replace so hab ich es auch im code richtig!

        PHP-Code:
        if (count($crosslink_word)) { 
        $message=preg_replace($crosslink_word$crosslink_url$message1); 

        Das Problem dürfte wohl if (count($crosslink_word)) weil $crosslink_word ein array ist..kann das sein und wie kann ich das dann lösen?

        vielen dank!

        Kommentar


        • #5
          was steht in crosslink drin?

          Kommentar


          • #6
            danke für deine Frage die ich dir gerne beantworte..Es gibt ein php file. In diesem stehen die wörter aus dem lexikon. z.b.:

            PHP-Code:
            $crosslink_word[] = '#\b('.'Logitech'.')\s#';
            $crosslink_url[] = '<a target="_blank" href="lexicon.'.$phpEx.'?letter='.'Logitech'.'" class="crosslink" title="'.'Logitech'.' Erkl&auml;rung">'.'Logitech'.'</a> ';
            $crosslink_word[] = '#\s('.'Logitech'.')\b#';
            $crosslink_url[] = ' <a target="_blank" href="lexicon.'.$phpEx.'?letter='.'Logitech'.'" class="crosslink" title="'.'Logitech'.' Erkl&auml;rung">'.'Logitech'.'</a>'

            Kommentar


            • #7
              Naja, wenn du den "gleichen" Ausdruck mehrmals in dein Array schreibst, wird er auch mehrmals das Wort ersetzen, nach dem du suchst. Wenn du beide Zeichenklassen (\b und \s) vor und hinter dem Ausdruck verwendest, stellst du sicher, dass vor und hinter dem Wort ein Leerzeichen (bei \b kann das auch z.B: ein Komma sein) stehen muss. Siehe auch: Quakenet/#php Tutorial - de - Reguläre Ausdrücke . Die Verwendung macht so also wenig Sinn, denke ich.
              http://hallophp.de

              Kommentar


              • #8
                Hallo,

                danke für deinen Hinweis. Sorry wenn ich jetzt nicht auf die Lösung komme. Wie müsste dann der letzte code aussehen damit es nur einmal ersetzt wird und funktioniert.

                viele grüße

                Kommentar


                • #9
                  Was er meint ist folgendes:
                  PHP-Code:
                  $crosslink_word[] = '#(\b|\s)('.'Logitech'.')(\b|\s)#'
                  Wenn du vor dem Hinzufügen in $crosslink_word[] noch überprüfst, ob dort bereits gleicher Ausdruck vorhanden ist, dann solltest du dein Problem gelöst haben.
                  sigpic

                  Kommentar


                  • #10
                    hallo,

                    ich hab jetzt mal das hier eingefügt von dir Frank:

                    PHP-Code:
                    $crosslink_word[] = '#(\b|\s)('.'Logitech'.')(\b|\s)#'
                    $crosslink_url[] = '<a href="lexicon.'.$phpEx.'?letter='.'Logitech'.'" class="crosslink" title="'.'Logitech'.' Erkl&auml;rung">'.'Logitech'.'</a> '
                    Wird aber trotzdem noch mehrfach verlinkt...weiss leider nicht weiter und freue mich über praktische Hilfe. danke

                    Kommentar


                    • #11
                      Ein kurzer Test zeigt, dass es so funktionieren sollte:

                      PHP-Code:
                      $string = <<<EOT
                      blub bla foo bla bla foo bla blub
                      EOT;

                      $search = array('/\b(foo)\b/i''/\b(bla)\b/i',);
                      $replace = array('<a href="">\1</a>''<em>\1</em>',);

                      echo 
                      preg_replace($search$replace$string1); 
                      Bist du auch sicher, dass in dem Array $crosslink_word jedes Wort auch wirklich nur einmal vorkommt?

                      Schau dir mal die Ausgabe von
                      Code:
                      echo '<pre>', print_r($crosslink_word), '</pre>';
                      an.

                      Gruß
                      http://hallophp.de

                      Kommentar


                      • #12
                        Danke für deine Hilfe. Ich habe mal das print_r ausgeführt. raus kommt:

                        [0] => #\b(Logitech)\s#
                        [1] => #\s(Logitech)\b#
                        [2] => #\b(Sony)\s#
                        [3] => #\s(Sony)\b#
                        usw usw usw

                        Der Satz sieht so aus:

                        Logitech asdf asdf Logitech asdf asdf Logitech

                        Alle 3 Logitech wurden ersetzt. Wenn ich [0] weglasse werden nur die beiden letzten ersetzt. bzw. das in der mitte und das letzte.

                        Danke für weitere Hilfe..bin ratlos...

                        Kommentar


                        • #13
                          ok habs gelöst...

                          PHP-Code:
                          if (count($crosslink_word)) {
                                  
                          $message=preg_replace($crosslink_word$crosslink_url$message1);
                              } 
                          wird

                          PHP-Code:
                                  $message=preg_replace($crosslink_word$crosslink_url$message1); 
                          hab also das If aussen rum entfernt...durch das if wurde es wohl jedesmal ersetzt...wenn er es gefunden hatte...das preg match wurde also jedesmal durchlaufen...das stimmt doch oder?

                          Hätte noch gerne, dass Groß & Kleinschreibung ignoriert wird, das er also auch logitech ersetzt..geht das?

                          Kommentar


                          • #14
                            ok verstehe > \b/i das ist i danke

                            Kommentar


                            • #15
                              So, jetzt ist mir noch was aufgefallen, hoffe mir kann jemand helfen. Das array sieht jetzt so aus:

                              $search = array('/\b(foo)\b/i', '/\b(bla)\b/i',);

                              wenn jetzt aber im Text irgendwo ein Bild ist und das Bild hat ein alt tag und in diesem alt tag steht z.b. alt="foo" dann wird dies auch ersetzt und dadurch entsteht natürlich ein html fehler weil:

                              <a href=""><img src="" alt="<a href="">foo</a>"></a> .....

                              Wie muss ich denn die regex so ändern, dass er "foo" im alt tag oder title tag nicht beachtet?

                              Kommentar

                              Lädt...
                              X