schildi: regexp: je nach ergebnis untersch. ersetzung

hallo,

ich möchte folgendes möglichst einfach darstellen:

die ersetzung der sonderzeichen ä,ö,ü mit ae, oe, ue

nun frage ich mich prinzipiell, wie es mit einem regulären ausdruck mittels backreferences möglich ist, je nach treffer richtig zu ersetzen.

wird also ä gefunden, ersetze mit ae, wird ö gefunden, ersetze mit oe usw.

mir geht es hier generell um ein prinzip, derartige ersetzungen mit regulären ausdrücken und backreferences zu lösen.

danke für eure vorschläge!

  1. Hello out there!

    die ersetzung der sonderzeichen ä,ö,ü mit ae, oe, ue

    nun frage ich mich prinzipiell, wie es mit einem regulären ausdruck mittels backreferences möglich ist, je nach treffer richtig zu ersetzen.

    Backreferences?

    preg_replace(), Beispiel 1537.

    See ya up the road,
    Gunnar

    --
    „Und [dieses Forum] soll […] auch ein Fachforum bleiben und kein Psychologieforum werden.“ (Kirsten Evers)
    1. preg_replace(), Beispiel 1537.

      See ya up the road,
      Gunnar

      perfekt. nicht aufgefallen. danke!

  2. n'abend,

    die ersetzung der sonderzeichen ä,ö,ü mit ae, oe, ue

    ... erreichst du am Einfachsten so:

     $zeichen = array( 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß'  => 'ss');  
    $string = "Hällö Wörld";  
    $ohneUmlaute = strtr( $string, $zeichen );
    

    mir geht es hier generell um ein prinzip, derartige ersetzungen mit regulären ausdrücken und backreferences zu lösen.

    du suchst preg_replace() und die dazugehörige Dokumentation. Auf der selben Seite gibt es auch ein kleines Beispiel dazu. Für diesen Spaß ist der Modifikator e (evaluate) verantwortlich

    preg_replace_callback() ist dann mal wieder eine php-typische "vereinfachung" des Obigen.

    $string = "Hällö Wörld";  
    function replaceUmlauts( $char ){  
      switch( $char[0] ) // gesamtes suchmuster  
      {  
        case 'ä': return 'ae'; break;  
        case 'Ä': return 'Ae'; break;  
        case 'ö': return 'oe'; break;  
        case 'Ö': return 'Oe'; break;  
        case 'ü': return 'ue'; break;  
        case 'Ü': return 'Ue'; break;  
        case 'ß': return 'ss'; break;  
      }  
    }  
    $ohneUmlaute = preg_replace_callback( '/[äöüß]/i', 'replaceUmlauts', $string );
    

    (beispiele getippt, nicht ausgeführt)

    weiterhin schönen abend...

    --
    Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. n'abend,

      die ersetzung der sonderzeichen ä,ö,ü mit ae, oe, ue

      ... erreichst du am Einfachsten so:

      $zeichen = array( 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß'  => 'ss');

      $string = "Hällö Wörld";
      $ohneUmlaute = strtr( $string, $zeichen );

      
      >   
      > > mir geht es hier generell um ein prinzip, derartige ersetzungen mit regulären ausdrücken und backreferences zu lösen.  
      >   
      > du suchst [preg_replace()](http://php.net/preg_replace) und die dazugehörige Dokumentation. Auf der selben Seite gibt es auch ein kleines [Beispiel](http://php.net/preg_replace#id3325588) dazu. Für diesen Spaß ist der [Modifikator](http://www.php.net/manual/de/reference.pcre.pattern.modifiers.php) e (evaluate) verantwortlich  
      >   
      
      damit hatte ichs auch probiert, mit preg\_replace\_callback wirds mir schon zu komplex, mit extra funktion und so.  
        
      jedoch scheint es, wie wenn man bei preg\_replace mit modifier e keine kontrollstrukturen verwenden kann. wie if else ...  
        
      der hinweis von bittersman vereinfacht zumidnest dieses problem jedoch optimal.
      
      1. n'abend,

        $zeichen = array( 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß'  => 'ss');

        $string = "Hällö Wörld";
        $ohneUmlaute = strtr( $string, $zeichen );

          
          
        
        > damit hatte ichs auch probiert, mit preg\_replace\_callback wirds mir schon zu komplex, mit extra funktion und so.  
          
        Was du eingangs als "Backreference" bezeichnetest, hat mein Hirn automagisch nach "Callback(-reference)" konvertiert. Dementsprechend wies ich dich auf die beiden Möglichkeiten zur Nutzung von Callback-Funktionen in Regulären Ausdrücken hin. Dass du - je nach Anforderung - dann eine eigene Callback-Funktion angeben musst, versteht sich von selbst.  
          
        
        > jedoch scheint es, wie wenn man bei preg\_replace mit modifier e keine kontrollstrukturen verwenden kann. wie if else ...  
          
        Das könnte daran liegen, dass dort "inline-PHP" erwartet wird, kein Code-Block. Braucht man das, würde man die Funktionalität in einer Callback-Funktion kapseln.  
          
        
        > der hinweis von bittersman vereinfacht zumidnest dieses problem jedoch optimal.  
          
        der Hinweis von Gunnar zeigt dir lediglich, dass du mehere "Ersetzungsgesuche" in einem einzigen Aufruf von preg\_replace ausführen kannst. Das ist aber - soweit ich dich verstanden habe - nicht das was du suchtest.  
          
        Solltest du mit Gunnars Hinweis doch zufrieden sein, möchte dich dich darauf hinweisen, dass es unnötig ist für solche Trivialfälle RegEx einzusetzen. RegExe sind - mit Ausnahmen - langsamer als die "einfachen String-Funktionen". Bevor du also (wie im folgenden Beispiel) mit Kanonen auf Spatzen schießt, solltest du überlegen stattdessen [strtr()](http://php.net/strtr) zu benutzen  
          
        ~~~php
         // unsinniger Gebrauch von Regular Expressions für triviale Ersetzungen:  
        $zeichenkette = 'Der schnelle braune Fuchs sprang über den faulen Hund.';  
          
        $suchen = array( '/schnelle/', '/braune/', '/Fuchs/' );  
        $ersetzen = array( 'Bär', 'schwarze', 'langsame' );  
        echo preg_replace($suchen, $ersetzen, $zeichenkette);
        
         // sinnvollerer Einsatz von strtr() für triviale Ersetzungen:  
        $zeichenkette = 'Der schnelle braune Fuchs sprang über den faulen Hund.';  
          
        $ersetzen = array( 'schnelle' => 'Bär', 'braune' => 'schwarze', 'fuchs' => 'Bär' );  
          
        echo strtr($zeichenkette, $ersetzen);
        

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|