hawkmaster: Mehrere Sonderzeichen in String ersetzen?

Hallo zusammen,

In einer Textdatei kommen deutsche Sonderzeichen kodiert vor, z.b.
Endgr<F6><DF>e  = Endgröße

Ich möchte gerne die kodierten Buchstaben < > umwandeln. Also das tatsächlich
"Endgröße" gespeichert werden kann.

Ich versuche es so;

  
if (preg_match_all("#<(.*?)>#", $string, $contents)){  
 foreach($contents[1] as $specialchar){  
   echo "gefunden wurde das Sonder-Zeichen- " .$specialchar."<br>";  
   $dez = hexdec($specialchar);  
   $special_char = preg_replace("#<($specialchar)>#",chr($dez),$string);  
 }  
  echo "ergebnis ist $special_char <br>";  
}  

so klappt es wenn nur einmal < > im String vorkommt, nicht aber wie im Beispiel zweimal < >  < > weil ja nur immer das letzte Zeichen das in der foreach Schleife gefunden wird, ersetzt wird.

Hat jemand eine Idee wie man das besser machen kann?

vielen Dank und viele Grüße
hawk

  1. Hi,

    so klappt es wenn nur einmal < > im String vorkommt, nicht aber wie im Beispiel zweimal < >  < > weil ja nur immer das letzte Zeichen das in der foreach Schleife gefunden wird, ersetzt wird.

    Hat jemand eine Idee wie man das besser machen kann?

    Informiere dich, was es mit der "Gierigkeit" (engl. greediness) von regulaeren Ausdruecken auf sich hat, und wie man sie abstellt.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Hallo Chris,

      Informiere dich, was es mit der "Gierigkeit" (engl. greediness) von regulaeren Ausdruecken auf sich hat, und wie man sie abstellt.

      ich weiss das RegEx gierig sein können. Jedoch glaube ich nicht das es hier so ein Problem sein dürfte oder?
      Ist es nicht eher so das in der Foreach Schleife in meinem Beispiel zweimal durchlaufen wird und dann halt immer nur der letzte gefunden Wert ersetzt wird?
      $special_char = preg_replace("#<($specialchar)>#",chr($dez),$string);

      Man müsste also $string zwischenspeichern.
      hm, na mal weiter suchen.

      vielen Dank und viele Grüße
      hawk

  2. Hi,

    foreach($contents[1] as $specialchar){

      
    Fehler gefunden. Der nächste, bitte.  
      
    Cheatah  
    
    -- 
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|  
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html  
    X-Will-Answer-Email: No  
    X-Please-Search-Archive-First: Absolutely Yes
    
    1. Hallo Cheatah

      Fehler gefunden. Der nächste, bitte.

      leider kann ich dir nicht ganz folgen???

      vielen Dank und viele Grüße
      hawk

      1. Hi,

        leider kann ich dir nicht ganz folgen???

        Schau dir noch mal an, worueber deiner foreach-Schleife laeuft.

        Wenn dir das nicht merkwuerdig vorkommt, dann schau noch mal mit print_r nach, was preg_match_all dir geliefert hat.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hallo ChrisB

          danke nochmals,

          Schau dir noch mal an, worueber deiner foreach-Schleife laeuft.

          also entweder steht mir heute einer ganz gewaltig auf der Leitung oder ich habe Tomaten vor den Augen :-)

          if (preg_match_all("#<(.*?)>#", $string, $contents)){
           foreach($contents[1] as $specialchar){
          ..

          Meint Ihr weil ich "$contents[1]" angebe anstatt "$contents"
          Das müsste schon stimmen weil ich ja ein Array bekomme als Ergebnis und nur den Teil brauche der gefunden wird. In meinem Ausgangsbeispiel also mit
          "Endgr<F6><DF>e", brauche ich ja nur
          "F6" und "DF"

          wenn ich ein;
          echo "gefunden wurde das Sonder-Zeichen- " .$specialchar."<br>";
          mache, wird mir ja auch beide Fundstellen korrekt angezeigt.

          Oder meint ihr was anderes?

          vielen Dank und viele Grüße
          hawk

          1. Hallo ChrisB,

            ist zwar schon wieder eine Weile her aber mich würde ehrlich interessieren was an der foreach Schleife falsch sein soll?

            vielen Dank und viele Grüße
            hawk

            1. Hi,

              ist zwar schon wieder eine Weile her aber mich würde ehrlich interessieren was an der foreach Schleife falsch sein soll?

              Mich auch, ja.
              Wenn ich dein Beispiel ausprobiere, werden auch mehrere Vorkommen von <xy> ersetzt.

              MfG ChrisB

              --
              „This is the author's opinion, not necessarily that of Starbucks.“
            2. echo $begrüßung;

              ist zwar schon wieder eine Weile her aber mich würde ehrlich interessieren was an der foreach Schleife falsch sein soll?

              Nichts. Das foreach($contents[1] ... sah nur auf den ersten Blick seltsam aus. Da $contents aber so aussieht,

              Array
              (
                  [0] => Array
                      (
                          [0] =>
                          [1] =>
                      )

              [1] => Array
                      (
                          [0] => F6
                          [1] => DF
                      )

              )

              ist das völlig in Ordnung gewesen. Nur die Gierigkeit des zweiten preg_replace() war das Problem.

              Das Problem lässt sich aber mit preg_replace_callback() eleganter lösen. Man braucht nur eine Funktion, die von der Fundstelle den Hex-Wert in das Zeichen umrechnet.

              echo preg_replace_callback('#<(.*)>#U', 'hex2char', $string);  
                
              function hex2char($match) {  
                return chr(hexdec($match[1]));  
              }
              

              $match bekommt für die erste Fundstelle dieses Array

              array(2) {
                  [0]=>
                  string(4) "<F6>"
                  [1]=>
                  string(2) "F6"
                }

              übergeben, also die komplette Fundstelle im Element 0 und aufgrund der Gruppierung im Pattern den Hexwert im Element 1. Dieser muss umgerechnet und zurückgegeben werden.

              echo "$verabschiedung $name";

              1. Hallo dedlfix, Hallo ChrisB

                danke nochmals für euer Feedback und für die Hinweise.
                Die "callback" Funkion hatte ich noch nie verwendet bisher, ist aber sicher mal interessant.

                Man lernt halt nie aus ;-)

                danke nochmals

                viele Grüße
                hawk