2. und folgende Buchstaben im String klein, wenn groß

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2. und folgende Buchstaben im String klein, wenn groß

    Hallo Zusammen,

    Gibt es eine Funktion die es mir erlaubt folgenden String so zu formatieren, dass falls der 2. und die folgenden Buchstaben eines Wortes groß geschrieben wurden, dann klein schreibt und den 1. groß, falls aber der 1. und die folgenden Buchstaben klein sind, diese nicht verändert.


    Sprich:
    "HALLO DAS IST EIN TEST" = "Hallo Das Ist Ein Test"
    "Hallo das ist ein Test" = "Hallo das ist ein Test"

    Klar sind mir die Funktionen wie mb_strtoupper(), mb_strtolower(), ucwords() usw. bekannt. Diese wandeln ja aber eben immer nur stur alles um und machen keine unterscheidung.

    Wahrscheinlich muss ich mir hier eine eigene Funktion basteln, oder? Hat hier Jemand einen anstoß zur realisierung?

    Oder hat Jemand eine andere Idee wie man damit umgeht. Ich möchte lediglich ein Einheitliches Bild in einem Kalender schaffen ohne das bestimmte Events durch Großschreibung hervorgehoben werden.


    Vielen herzlichen Dank
    Gruß Jan

  • #2
    Hallo,

    PHP Code:
    <?php
        mb_internal_encoding
    ("utf-8");
        
    $text "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test.";
        
    $pieces preg_split("/(\\PL+)/u"$text, -1PREG_SPLIT_DELIM_CAPTURE);
        for (
    $i 0$i count($pieces); $i += 2) {
            if (
    strlen($pieces[$i])) {
                
    $pieces[$i] = mb_substr($pieces[$i], 01) . mb_strtolower(mb_substr($pieces[$i], 1));
            }
        }
        
    $text implode(""$pieces); // "Hallo, Das Ist Ein äöüß Test, Hallo, das ist ein Äöüß Test."
    ?>
    Gruß,

    Amica
    Last edited by AmicaNoctis; 24-11-2009, 00:38. Reason: Code war nicht multibyte safe, jetzt ist er's
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Comment


    • #3
      Hallo Amica,

      vielen herzlichen Dank für deine Antwort. Dein Code hat mich auf jeden Fall weiter gebracht. Allerdings hat dieser nicht sofort bei mir geklappt.

      Ich habe diesen jetzt wie folgt geändert und jetzt funktioniert er. Kann ich das so lassen?:

      PHP Code:
      <?php
          mb_internal_encoding
      ("ISO-8859-15");
          
      $text "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test.";
          
      $pieces preg_split("/ /"$text, -1PREG_SPLIT_DELIM_CAPTURE);
          for (
      $i 0$i count($pieces); $i++) {
              if (
      strlen($pieces[$i])) {
                  
      $pieces[$i] = mb_substr($pieces[$i], 01) . mb_strtolower(mb_substr($pieces[$i], 1));
              }
          }
          
      $text implode(" "$pieces); // "Hallo, Das Ist Ein äöüß Test, Hallo, das ist ein Äöüß Test."
          
      echo $text;
      ?>

      Comment


      • #4
        Eigentlich war der Code schon so in Ordnung. Wenn er nicht funktioniert haben sollte, liegt das vermutlich entweder an einer veralteten PHP Version oder dem falschen Zeichensatz. Deine Änderungen ergeben nicht alle einen Sinn. Insbesondere der RegEx nicht mehr und das $i++ auch nicht. Was genau hat denn an der ersten Version nicht funktioniert?

        Edit: achso, sorry, dass $i++ macht in der Form schon Sinn, aber nur, weil im RegEx jetzt die Klammern fehlen
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Comment


        • #5
          Originally posted by jandayne View Post
          ...
          Sprich:
          "HALLO DAS IST EIN TEST" = "Hallo Das Ist Ein Test"
          "Hallo das ist ein Test" = "Hallo das ist ein Test"
          ...
          Ich möchte lediglich ein Einheitliches Bild in einem Kalender schaffen ohne das bestimmte Events durch Großschreibung hervorgehoben werden.
          Damit verunstaltest du aber beispielsweise römische Zahlzeichen.
          Die kommen in Kalendern schon mal vor:

          "19. April 2005: Amtseinführung Pabst Benedikt des XVI."

          *edit*
          Mist, der konstruktive Teil dieses Posts ist in der Erstversion irgendwie abhanden gekommen. Daher etwas verspätet, hier eine Papst-taugliche Variante:

          PHP Code:
          preg_replace_callback(
              
          '/(?![IVXLCDM]+\P{L})(?:\p{Lu}|(\p{Ll}))\p{L}+/u',
              
          create_function(
                  
          '$h',
                  
          'return mb_convert_case($h[0], isset($h[1]) ? MB_CASE_LOWER : MB_CASE_TITLE);'
              
          ),
              
          $text
          ); 
          Eigentlich wäre das ein One-Liner, aber da nicht umbrochener Quelltext hier nicht so gern gesehen ist, hab ich das mal auf 8 Zeilen verteilt. ;-)
          Last edited by fireweasel; 24-11-2009, 23:15.
          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

          Comment


          • #6
            n'Abend,

            Originally posted by fireweasel View Post
            Damit verunstaltest du aber beispielsweise römische Zahlzeichen.
            Die kommen in Kalendern schon mal vor:
            "19. April 2005: Amtseinführung Pabst Benedikt des XVI."
            Das könnte man eigentlich simpel umgehen, indem man folgendes an den Anfang der for-Schleife schreibt:
            PHP Code:
            if(preg_match('#^[IVXLCDM]+$#'$pieces[$i])) continue; 
            Könnte man natürlich auch noch genauer machen.
            Auswahl an PHP- und weiteren Scripts auf meiner Website.

            Comment


            • #7
              Guter Einwand! Danke! Korrektur hier:

              PHP Code:
              <?php
                  mb_internal_encoding
              ("utf-8");
                  
              $text "HALLO, DAS IST EIN äÖÜß TEST, Hallo, das ist ein Äöüß Test.";
                  
              $pieces preg_split("/(\\PL+)/u"$text, -1PREG_SPLIT_DELIM_CAPTURE);
                  
              $roman "/^M{0,4}((C[MD])|(D?C{0,3}))((X[CL])|(L?X{0,3}))((I[XV])|(V?I{0,3}))$/";
                  for (
              $i 0$i count($pieces); $i += 2) {
                      if (
              strlen($pieces[$i]) && !preg_match($roman$pieces[$i])) {
                          
              $pieces[$i] = mb_substr($pieces[$i], 01) . mb_strtolower(mb_substr($pieces[$i], 1));
                      }
                  }
                  
              $text implode(""$pieces);
                  echo(
              $text);
              ?>
              Wenn, dann richtig
              Last edited by AmicaNoctis; 24-11-2009, 20:28.
              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
              Super, danke!
              [/COLOR]

              Comment


              • #8
                Und was ist mit Abkürzungen? PHP, MySQL, HTML, OSX, PS3, JPG, EU, USA, ARD, ZDF, UStG, PKW, DVD, XP, usw.

                Comment


                • #9
                  Recht hast du, aber darauf hab ich jetzt keinen Bock mehr. Soll sich der TO selbst drum kümmern
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Comment


                  • #10
                    Originally posted by h3ll View Post
                    Und was ist mit Abkürzungen? PHP, MySQL, HTML, OSX, PS3, JPG, EU, USA, ARD, ZDF, UStG, PKW, DVD, XP, usw.
                    Nicht zu vergessen: BenQ, eBay, BahnCard ...

                    Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren.
                    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                    Comment


                    • #11
                      Für dieses Buchstabenproblem kann es keine perfekte Lösung geben. Man kann eine finden, die viel erschlägt, aber niemals alles. Denn in unserer Sprache können Abkürzungen und Eigennamen (mit Großbuchstaben) beliebig gebildet werden, d.h. es gibt endlos viele und keinen Algorithmus, der alle erzeugt.

                      Statt selbst eine Näherungslösung zu entwickeln, würde ich einfach bestehende nutzen - PHP: Pspell - Manual.

                      Comment


                      • #12
                        Das Problem schreit nach einer biologischen Komponente!
                        (Festanstellung)
                        Wir werden alle sterben

                        Comment


                        • #13
                          Originally posted by fireweasel View Post
                          Nicht zu vergessen: BenQ, eBay, BahnCard ...

                          Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren.
                          Kommt auf den Kalender an. Man kann in Kalendern auch PHP-Konferenzen eintragen, usw.

                          Comment


                          • #14
                            Originally posted by h3ll View Post

                            Originally posted by fireweasel View Post
                            Nicht zu vergessen: BenQ, eBay, BahnCard ...

                            Das sind alles Wörter, die in Kalendern praktisch nicht zu finden sind, daher kann man sie ignorieren.
                            Kommt auf den Kalender an. Man kann in Kalendern auch PHP-Konferenzen eintragen, usw.
                            OffTopic:

                            Aber sicher doch. Deswegen hatte ich auch den Smiley mit dem zugekniffenen Auge hinter meine Aussage gesetzt. Wobei ich nie freiwillig auf PHP-Konferenzen gehen würde, höchstens gegen Bezahlung und dann auch nur, wenn man dort Bullshit-Bingo spielen dürfte ...

                            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                            Comment

                            Working...
                            X