Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu preg_replace in Verbindung mit Umlauten

Einklappen

Neue Werbung 2019

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

  • Frage zu preg_replace in Verbindung mit Umlauten

    Hallo,

    ich möchte folgende Funktion verwenden:

    PHP-Code:
    function my_ucwords($str$is_name=false) {
       
    // exceptions to standard case conversion
       
    if ($is_name) {
           
    $all_uppercase '';
           
    $all_lowercase 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And|Von Der|';
       } else {
           
    // addresses, essay titles ... and anything else
           
    $all_uppercase 'Po|Rr|Se|Sw|Ne|Nw';
           
    $all_lowercase 'A|And|As|By|In|Of|Or|To';
       }
       
    $prefixes 'Mc|Dr';
       
    $suffixes "'S";
       
    $str mb_convert_case($strMB_CASE_TITLE"UTF-8"); 
       
    // captialize all first letters
       
    $str preg_replace('/\\b(\\w)/e''strtoupper("$1")'strtolower(trim($str)));

       if (
    $all_uppercase) {
           
    // capitalize acronymns and initialisms e.g. PHP
           
    $str preg_replace("/\\b($all_uppercase)\\b/e"'strtoupper("$1")'$str);
       }
       if (
    $all_lowercase) {
           
    // decapitalize short words e.g. and
           
    if ($is_name) {
               
    // all occurences will be changed to lowercase
               
    $str preg_replace("/\\b($all_lowercase)\\b/e"'strtolower("$1")'$str);
           } else {
               
    // first and last word will not be changed to lower case (i.e. titles)
               
    $str preg_replace("/(?<=\\W)($all_lowercase)(?=\\W)/e"'strtolower("$1")'$str);
           }
       }
       if (
    $prefixes) {
           
    // capitalize letter after certain name prefixes e.g 'Mc'
           
    $str preg_replace("/\\b($prefixes)(\\w)/e"'"$1".strtoupper("$2")'$str);
       }
       if (
    $suffixes) {
           
    // decapitalize certain word suffixes e.g. 's
           
    $str preg_replace("/(\\w)($suffixes)\\b/e"'"$1".strtolower("$2")'$str);
       }
       return 
    $str;

    Diese Funktion wandelt kleingeschriebene Wörter in Wörter um, die mit einem Großbuchstaben beginnen; ausgenommen Wörter, die zum Anfang in der Variable $all_lowercase angegeben sind (bspw. soll das "von der" in dem Nachnamen "von der Leyen" klein geschrieben bleiben).

    Funktioniert auch hervorragend, allerdings gibt es ein Problem:

    Ich gebe der Funktion einen beispielhaften Wert (täve):
    Code:
    $name = "täve";
    Der Aufruf der Funktion my_ucwords mit anschließender Ausgabe mit echo
    Code:
    $neuername =  my_ucwords($name, true);
    echo $neuername;
    ergibt TäVe. Das kleine "t" am Wortanfang wurde ordnungsgemäß in ein großes "T" gewandelt. ABER: nach dem Umlaut "ä" steht nun ein großes "V". Dieses Problem tritt auch bei Namen mit den Buchstaben "ö", "ü" oder "ß" auf. Woran liegt es, dass der Buchstabe nach dem Umlaut plötzlich groß geschrieben wird.

    Kann mit bitte jemand bei der Lösung dieses Problems behilflich sein? Vielen Dank im Voraus!

  • #2
    Wird vermutlich daran liegen, dass du nicht nur Whitespace-Zeichen als Worttrenner verwendest. (Was ja auch richtig ist, z.B. bei Doppelnamen mit Bindestrich gibt es ja auch kein Leerzeichen dazwischen.)
    Genau analysieren will ich es um die Uhrzeit nicht mehr, aber wahrscheinlich verwendest du eine Zeichengruppe die unsere Umlaute (nicht) einschließt. Klassen wie \w sind z.B. auch von der Locale-Einstellung abhängig. Dadurch wird "ä" als Worttrenner erkannt und danach entsprechend mit Großbuchstaben angefangen.

    Kommentar


    • #3
      Vielen Dank für die schnelle Antwort.

      Hab auch schon mal so in die Richtung gedacht, dass es an den Trennern liegen könnte. Nur wie kann ich die in dem Skript angeben? Müssten eigentlich nur Leerzeichen und Bindestrich sein (als Trenner), mehr kommt ja in Namen nicht vor.

      Kannst du mir da vielleicht weiterhelfen?

      Kommentar


      • #4
        Die Pattern sind alle nicht im UTF-8-Mode.

        - http://php.net/manual/en/reference.p....modifiers.php

        Deshalb wird das "ä" (das vermutlich in UTF-8 vorliegt) nicht als "ä" interpretiert, sondern als seine beiden einzelnen Bytes.

        Setze neben e noch u hinzu.

        PHP-Code:
        $str preg_replace('/\\b(\\w)/eu''strtoupper("$1")'strtolower(trim($str))); 
        Usw.

        Kommentar


        • #5
          Hallo mermshaus,

          vielen Dank für deine Hilfe.
          Muss das u nur in der folgenden Zeile nach dem e eingefügt werden

          Code:
          $str = preg_replace('/\\b(\\w)/eu', 'strtoupper("$1")', strtolower(trim($str)));
          oder auch in den restlichen fünf Code-Zeilen, in denen /e vorkommt?

          Kommentar


          • #6
            Na wenn du dort auch mit Unicode/UTF-8 arbeitest, dann läge das auf der Hand, oder?

            Der Modifier /e ist übrigens seit PHP 5.5 veraltet. Bei neueren PHP-Versionen wirst du damit also nicht glücklich.

            Kommentar


            • #7
              Hallo Tropi, danke für deinen Hinweis.

              Kannst du mir sagen, wie ich das Problem dann ab PHP 5.5. löse?
              Ich bin auf dem Gebiet der Modifier kein Spezi, daher wäre ich froh, wenn mir da jemand helfen könnte und ich eine Lösung habe, die auch zukünftig noch funktionert.

              Kommentar


              • #8
                Zitat von christiancg80 Beitrag anzeigen
                Kannst du mir sagen, wie ich das Problem dann ab PHP 5.5. löse?
                mit preg_replace_callback().

                Kommentar


                • #9
                  nutzt man eig. noch ereg ?

                  Kommentar


                  • #10
                    Zitat von j.durini Beitrag anzeigen
                    nutzt man eig. noch ereg ?
                    Nein, die ereg-Funktionen sind seit PHP 5.3 als veraltet markiert und stehen auf der Abschussliste - das steht aber alles im Handbuch ...

                    Kommentar


                    • #11
                      Vielen Dank an alle für die Hinweise.

                      Kann mir jemand bei der Anpassung meiner oben stehenden Funktion mit
                      Code:
                      preg_replace_callback().
                      helfen, sodass ich damit das gleiche Ergebnis bekomme?
                      Bin sehr dankbar über eure Hilfe hier!!!

                      Kommentar


                      • #12
                        Wo hakt es denn?

                        Kommentar


                        • #13
                          Hallo mermshaus,

                          es hakt daran, wie ich die im ersten Post geschriebene Funktion entsprechend mit dem alternativen Befehl preg_replace_callback() so anpasse, dass sie auch ab der Version PHP 5.5 zu 100% funktioniert.
                          Ich bin auf diesem Gebiet wie geschrieben nicht DER Spezi und wäre da über deine/eure Hilfe extrem dankbar.

                          Kommentar


                          • #14
                            Aber wobei brauchst du denn konkret Hilfe?

                            - http://php.net/manual/en/function.pr...e-callback.php

                            Kommentar


                            • #15
                              Ich versuch mein Glück mal, und passe die Funktion an.
                              Da ich da nicht so firm drin bin, muss ich eben bissl rumprobieren ...

                              Kommentar

                              Lädt...
                              X