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

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

  • 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
    Zuletzt geändert von AmicaNoctis; 24.11.2009, 01:38. Grund: 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]

    Kommentar


    • #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;
      ?>

      Kommentar


      • #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]

        Kommentar


        • #5
          Zitat von jandayne Beitrag anzeigen
          ...
          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. ;-)
          Zuletzt geändert von fireweasel; 25.11.2009, 00:15.
          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

          Kommentar


          • #6
            n'Abend,

            Zitat von fireweasel Beitrag anzeigen
            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.

            Kommentar


            • #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
              Zuletzt geändert von AmicaNoctis; 24.11.2009, 21: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]

              Kommentar


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

                Kommentar


                • #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]

                  Kommentar


                  • #10
                    Zitat von h3ll Beitrag anzeigen
                    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!

                    Kommentar


                    • #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.

                      Kommentar


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

                        Kommentar


                        • #13
                          Zitat von fireweasel Beitrag anzeigen
                          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.

                          Kommentar


                          • #14
                            Zitat von h3ll Beitrag anzeigen

                            Zitat von fireweasel Beitrag anzeigen
                            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!

                            Kommentar

                            Lädt...
                            X