Avalas: String ersetzen - Problem mit Groß-/Kleinschreibung

Hi,

ich möchte bestimmte Wörter fett formatieren, allerdings sollen nicht nur einzelne Wörter formatiert werden, sondern auch zusammengesetzte Wörter.

Damit es klar wird: ersetzt werden soll "Ball" und "ball".

Ball -> <b>Ball</b>
Fußball -> Fuß<b>ball</b>

Ist ja eigentlich kein Probem; dachte ich:

<?php  
  
$wort = "Ball";  
$str = str_ireplace($wort, "<b>$wort</b>", $text);  
  
echo $str;  
  
?>

Aber damit wird aus Ball -> <b>ball</b> (also kleingeschrieben). Mit str_replace wird dagegen Fußball nicht ersetzt.

Gibt es dafür irgendeinen Befehl? Oder muss ich nachträglich prüfen, ob das ersetzte Wort groß oder kleingeschrieben wurde?

  1. Lieber Avalas,

    Damit es klar wird: ersetzt werden soll "Ball" und "ball".

    Ball -> <b>Ball</b>
    Fußball -> Fuß<b>ball</b>

    $str = str_ireplace($wort, "<b>$wort</b>", $text);

    da ist preg_replace meiner Meinung nach besser geeignet, da man dort Referenzen im Audruck erzeugen kann, die man dann in der Ersetzung wieder benutzen kann. Beachte die Runden Klammern um $wort und die escape-te "1" in der Ersetzung:

    $wort = "BaLl";  
    $str = preg_replace('~(?is)('.$wort.')~', '<b>\\1</b>', $str);
    

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix!

      da ist preg_replace meiner Meinung nach besser geeignet..

      FACK!

      Die Bechäftigung der/des OP mit der Dokumentation von str_ireplace
      ist IMHO trotzdem sinnvoll - zumal sie/er in der Fragestellung erkennen ließ, das PHP-Manual nicht aufmerksam genug gelesen zu haben.

      au relire

      Sven

      --
      "There is no data, there is only XUL"
      http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
      1. Hi,

        vielen Dank für die Antworten. Und ja, ER :) hat das Manual nicht sooooo ausführlich gelesen, aber durchaus so ausführlich, dass ich dort auch das Beispiel gesehen habe; das für mich ohne Erklärung aber leider wenig Aussagekraft hat. Wie sähe das denn aus, wenn ich statt >ball< eine >$variable< benutzen will?

        Habe jetzt, da ich das mit str_ireplace nicht durchschaue, mal die preg_replace-Variante genommen. Klappt wunderbar, also nochmals, vielen Dank :)

      2. Nachtrag:

        Hier gibts noch eine Anleitung, wie man es schafft, dass Text nur außerhalb von Tags < >  ersetzt wird (da sonst ja z.B. Links zerstört werden in denen das zu ersetzende Wort auch vorkommt):

        http://www.php-faq.de/q/q-regexp-ersetzen.html

      3. Okay, läuft _fast_ perfekt :)

        Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?

        1. gudn tach!

          Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?

          mit dem zeichen | kann man alternativen angeben.
          z.b. preg_replace('/ich gehe (in die schule|ins bett|nach hause)/', 'ich schleiche $1', $str);

          meinst du sowas? mehr dazu unter http://de2.php.net/manual/en/reference.pcre.pattern.syntax.php

          prost
          seth

          1. Ja, im Grunde schon.

            Aber ich habe ja nur meine Variable. Diese müsste ich doch erstmal mit $zerlegt = explode(" ", $variable); in x Wörter trennen.

            Dann könnte ich mit

            ~~~php foreach($zerlegt as $format)
               {
                 $str = preg_replace($format, "<b>$format</b>", $text);
               }

            alle Treffer formatieren.  
              
            Nur wie schaff ich es, das ganze wieder zusammenzufügen und auszugeben? Einfach ein `echo $str;`{:.language-php} am Ende, und in der Ausgabe ist nur das jeweils letzte Worde in der Variable formatiert, `echo $str;`{:.language-php} in der foreach-Anweisung ergibt logischerweise x identische Ausgaben.
            
            1. Liebe(r) Avalas,

              Dann könnte ich mit

              ~~~php

              foreach($zerlegt as $format)

              {
                   $str = preg_replace($format, "<b>$format</b>", $text);
                 }

              
              > alle Treffer formatieren.  
                
              nö, so nicht, sondern so:  
                
              ~~~php
              $woerter = array("BaLl", "aChteRbahn", "schokoladenEIS");  
              $muster = '~(is)('.implode('|', $woerter).')~';  
              $str = preg_replace($muster, '<b>\\1</b>', $str);
              

              Liebe Grüße aus Ellwangen,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Okay, aber ich habe ja leider keine festen Wörter die zu ersetzen sind, sondern meine Variable, die dynamisch erzeugte Wörter beinhaltet, die dann ersetzt werden sollen.

                1. Liebe(r) Avalas,

                  Okay, aber ich habe ja leider keine festen Wörter die zu ersetzen sind, sondern meine Variable, die dynamisch erzeugte Wörter beinhaltet, die dann ersetzt werden sollen.

                  und was war dann an meinem ursprünglichen Posting nicht zufriedenstellend?

                  Liebe Grüße aus Ellwangen,

                  Felix Riesterer.

                  --
                  ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                  1. Das klappt ja wunderbar, aber eben nur für ein einzelnes Wort. Wenn die Variable mehr Wörter einthält aber nicht mehr :(

                    1. Liebe(r) Avalas,

                      definiere

                      Wenn die Variable mehr Wörter einthält

                      und Dir kann geholfen werden.

                      Liebe Grüße aus Ellwangen,

                      Felix Riesterer.

                      --
                      ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                      1. Hi,

                        also über ein Eingabefeld können beliebige Wörter angegeben werden, die hervorgehoben werden sollen (quasi sowas wie eine Suchfunktion). Und diese Wörter werden eben an meine Variable übergeben (mit Leerzeichen getrennt, also z.B. &markieren=ball+kopf), so dass sie dann in meinem Text hervorgehoben werden können.

                        1. Liebe(r) Avalas,

                          z.B. &markieren=ball+kopf

                          das sind Parameter eines URI-Strings! Wenn Du halt immer gleich mit der kompletten Wahrheit herausrücken würdest, dann könnte man Dir auch kompetent helfen. Forumsneulinge scheinen immer wieder zu einer saudämlichen Geheimniskrämerei zu neigen - echt!?!

                          $woerter = array();  
                          if (isset($_GET['markieren'])) {  
                              $woerter = preg_split('~[\+ ]~', $_GET['markieren']);  
                          }  
                            
                          if (count($woerter) > 0) {  
                              $muster = '~(is)('.implode('|', $woerter).')~';  
                              $str = preg_replace($muster, '<b>\\1</b>', $str);  
                          }
                          

                          Liebe Grüße aus Ellwangen,

                          Felix Riesterer.

                          --
                          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
                          1. Hi,

                            nun, ich dachte nicht, worauf das alles hinausläuft ;-)

                            Am anfang gings mir ja nur um das simple Ersetzen eines Wortes, bis ich gemerkt habe, dass es eben Fälle mit mehreren Worten geben kann.

                            Und da am Anfang alles so gut geklappt hat, dachte ich es wäre auch alles klar. Dass ich mich so unklar ausgedrückt habe, war mir nicht bewusst - sorry.

                            Leider funktioniert das ganze aber noch immer nicht so recht, drum hol ich lieber noch mal aus :-) (wenn hier jetzt aber alle die Waffen niederstrecken, nehm ichs auch keinem übel)

                            Denn das Problem was ich jetzt habe: wo ist in deinem Code der Text, der die zu ersetzenden Wörter enthält? Ich kann ja nicht sagen ersetze Wort abc und Wort xyz, solange gar kein Text da ist.

                            Vorgesehen war das ganze so (für ein Wort klappt das ja auch schon einwandfrei):

                            if(isset($_GET['markieren'])  
                            {  
                              $treffer = htmlentities($_GET['markieren']);  
                            }  
                              
                            // Datei öffnen und Inhalte speichern  
                            $datei = "regeln.php";  
                              
                            $inhalt = file_get_contents($datei);  
                              
                            $s = $treffer; // zu ersetzender Begriff  
                            $t = $inhalt;  // Text in dem der  zu ersetzende Begriff vorkommt  
                              
                            // Syntax zum Ersetzen nur außerhalb von Tags  
                            $str = preg_replace("/((<[^>]*)|$s)/ie", '"\2"=="\1"? "\1":"<span class=\"markieren\">\1</span>"', $t);  
                              
                            // Ausgabe  
                            echo $str;
                            

                            Leider weiß ich nicht, wie ich jetzt in deinem Code die ausgelesene Datei (regeln.php) unterbringe.

                            1. Hallo

                              Leider funktioniert das ganze aber noch immer nicht so recht, drum hol ich lieber noch mal aus :-) (wenn hier jetzt aber alle die Waffen niederstrecken, nehm ichs auch keinem übel)

                              Denn das Problem was ich jetzt habe: wo ist in deinem Code der Text, der die zu ersetzenden Wörter enthält? Ich kann ja nicht sagen ersetze Wort abc und Wort xyz, solange gar kein Text da ist.

                              Wenn du den relevanten Code aus Felix' Posting nicht gelöscht hättest, würde sich die Frage nicht stellen.

                              z.B. &markieren=ball+kopf

                              das sind Parameter eines URI-Strings!

                              $woerter = array();

                              if (isset($_GET['markieren'])) {
                                  $woerter = preg_split('~[+ ]~', $_GET['markieren']);
                              }

                                
                              Prüft, ob `$_GET["markieren"]`{:.language-php} existiert, bei Existenz erfolgt Auftrennung am "+". Die zu markierenden Begriffe liegen hernach im Array `$woerter`{:.language-php} vor.  
                                
                              gegen:  
                                
                              
                              > Vorgesehen war das ganze so (für ein Wort klappt das ja auch schon einwandfrei):  
                              >   
                              > ~~~php
                              
                              if(isset($_GET['markieren'])  
                              
                              > {  
                              >   $treffer = htmlentities($_GET['markieren']);  
                              > }
                              
                              

                              Tschö, Auge

                              --
                              Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                              (Victor Hugo)
                              Veranstaltungsdatenbank Vdb 0.2
                              1. Hallo

                                $woerter = array();

                                if (isset($_GET['markieren'])) {
                                    $woerter = preg_split('~[+ ]~', $_GET['markieren']);
                                }

                                
                                >   
                                > Prüft, ob `$_GET["markieren"]`{:.language-php} existiert, bei Existenz erfolgt Auftrennung am "+". Die zu markierenden Begriffe liegen hernach im Array `$woerter`{:.language-php} vor.  
                                  
                                Ergänzung (bevor das wieder verloren geht):  
                                  
                                ~~~php
                                if (count($woerter) > 0) {  
                                    $muster = '~(is)('.implode('|', $woerter).')~';  
                                    $str = preg_replace($muster, '<b>\\1</b>', $str);  
                                }
                                

                                Diese Funktion (ebenfalls aus Felix' Posting) prüft, ob im Array $woerter mehr als 0 Werte drin sind. Trifft dies zu, werden sie per implode zu einer Zeichenkette verschmolzen. Die einzelnen Begriffe sind dann durch die Pipe "|" getrennt ("ball|kopf"), genau so, wie du sie danach im regulären Ausdruck zum Markieren der Begriffe im Text brauchst.

                                Tschö, Auge

                                --
                                Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                                (Victor Hugo)
                                Veranstaltungsdatenbank Vdb 0.2
        2. Con ta bai!

          Ich geh mal davon aus, dass es nicht ganz trivial ist, dass wenn die Variable mehrere Worte enthält, diese alle zu formatieren? Unabhängig davon, wo sie im Text vorkommen!?

          Du meinst, Du willst nicht nur "Ball", sondern im selben Durchlauf auch gleich "Topf" und "Achterbahn" ersetzen? Dafür genügt eine Oder-Verknüpfung der Wörter:
          $wort = '(Ball)|(Topf)|(Achterbahn)';
          Der Rest bleibt unverändert, denn die Referenz enthält ja sowieso das gefundene Wort - egal, ob es eine Variante von "Ball" oder ein ganz anderes ist.

          Viele Grüße vom Længlich

          1. Merhaba!

            Bin gerade mal seths Link gefolgt: Die Klammern sind unnötig. Statt

            $wort = '(Ball)|(Topf)|(Achterbahn)';

            also lieber
            $wort = 'Ball|Topf|Achterbahn';

            Viele Grüße vom Længlich

  2. Salut Avalas!

    probiere bitte mal das:

    <?php  
    echo $bodytag = str_ireplace("%ball%", "<b>ball</b>", "Schalke spielt:Fuss%ball%");  
    ?>  
    
    

    Und danach möchtest du das bestimmt lesen:
    http://de.php.net/manual/de/function.str-ireplace.php

    au relire

    Sven

    --
    "There is no data, there is only XUL"
    http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
    1. gudn tach!

      probiere bitte mal das:

      <?php

      echo $bodytag = str_ireplace("%ball%", "<b>ball</b>", "Schalke spielt:Fuss%ball%");
      ?>

        
      warum?  
        
      
      > Und danach möchtest du das bestimmt lesen:  
      > <http://de.php.net/manual/de/function.str-ireplace.php>  
        
      aeh, er hat doch im aufruf nichts falsch gemacht, oder? warum soll der OP also das manual bzgl. dieser funktion lesen, wenn die hier gar nix bringt? oder hab ich was ueberlesen?  
        
      prost  
      seth