ucfirst auf Teile vom String anwenden!?

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

  • ucfirst auf Teile vom String anwenden!?

    Hallo, hier schon mal mein Code:
    PHP-Code:
    function sentence_case($string) {
        
    $sentences preg_split('/([ -.?!]+)/'$string, -1PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
        
    $new_string '';
        foreach (
    $sentences as $key => $sentence) {
            
    $new_string .= ($key 1) == 0?
                
    ucfirst(strtolower(trim($sentence))) :
                
    $sentence.'';
        }
        return 
    trim($new_string);
    }

    echo 
    sentence_case("DRK VEREIN FÜR DIES UND FÜR DAS IN KÖLN"); 
    // Drk Verein Für Dies Und Für Das In Köln
    --- So kommt es raus

    Diesen Schnipsen habe ich auf php.net gefunden und nutze Ihn eigentlich schon seit Jahren. Allerdings werden Abkürzungen und (und, dies, das) auch mit behaldelt. Ich habe ich mich mal auf die Suche gemacht um dies vielleicht auch noch hin zu bekommen.

    // DRK Verein für dies und für das in Köln
    --- So sollte es optimalerweise aussehen


    Ich dachte mir verschiedene Wörter in ein Array zu schieben und damit jeweils komplett klein zu schreiben bzw. komplett groß zu schreiben.

    klein = "und","dies","für","in"
    groß = "DRK"

    kann mir da jemand weiter helfen?

    Cu Susi
    PHP 8.0, MariaDB 10.5 auf U20.04

  • #2
    PHP kennt in_array() !
    Und dann kannst du die Behandlung davon abhängig machen.
    Wir werden alle sterben

    Kommentar


    • #3
      Sowas wirst du wohl ohne umfangreichem Wörterbuch und Grammatik-Parser nicht wirklich schaffen. Mit einem einfachen Array kommst du hier nicht weiter.

      Beispiel:

      "Wir laufen zur Bushaltestelle."
      "Das Laufen ist anstrengend."

      Einmal klein und einmal groß geschrieben.

      Kommentar


      • #4
        Natürlich kann das Vorhaben sehr Umfangreich sein. Nicht aber in meinem Fall. Die Datensatze die ich habe, sind im Wortumfang relativ begrenzt. Es sind immer nur Bezeichnungen die dem Beispiel ähnlich sind. Also es betrifft wirklich nur Füllworter wie (und, auf, der, die, das, usw) und Eigennamen bzw Abkürzungen (THC, OCB, OK). Da ist mit wenigen Werten schon viel geholfen.

        Es muss auch nicht 100%ig sein. Nur diese komplette Großschreibung die ich bei vielen Datensätzen habe, sieht etwas unprof. aus.

        ####
        @combie
        die func in_array ist mir bekannt, nutze sie sogar hin und wieder.
        Mein Problem ist aber, dass ich nicht hin bekomme dies in meine gefundene Funktion so zu übernehmen das sie tut was ich gerne möchte.
        PHP 8.0, MariaDB 10.5 auf U20.04

        Kommentar


        • #5
          Wo klemmt es denn?
          Wir werden alle sterben

          Kommentar


          • #6
            Ich habe es vorhin mal probiert, dabei bin ich folgendermaßen vorgegangen
            PHP-Code:
            function sentence_case($string) {
                
            $sentences preg_split('/([ ]+)/'$string, -1PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
                
            $new_string '';

                
            $klein = array("DER""DIE""DAS""UND""IN");
                
            $gross = array("THC""OCB""OK""MFG");

                foreach (
            $sentences as $key => $sentence) {
                    if (
            in_array($klein$sentence)) {
                        
            $new_string .= strtolower(trim($sentence)); 
                    }
                    elseif (
            in_array($gross$sentence)) {
                        
            $new_string .= strtolower(trim($sentence)); 
                    }
                    else {
                        
            $new_string .= ucfirst(strtolower(trim($sentence))); 
                    }
                }
                return 
            trim($new_string);
            }

            echo 
            sentence_case("OCB DER DIE BLAUES THC IN KÖLN"); 
            Soweit ich das verstehe ist $sentences ein ARRAY. $sentence wird durch die foreach-Schleife zu einem String.
            Nun kann ich aber mit in_array nur Array's miteinander vergleichen.

            Also hier liegt erst einmal mein Problem. Oder sollte ich doch besser preg_replace nutzen und den ganzen foreach Kram weg lassen!?
            PHP 8.0, MariaDB 10.5 auf U20.04

            Kommentar


            • #7
              Zitat von SusiSorglos Beitrag anzeigen
              Soweit ich das verstehe ist $sentences ein ARRAY. $sentence wird durch die foreach-Schleife zu einem String.
              Wenn dein split richtig funktioniert hat (das findest du mit einem einfachen var_dump heraus), dann ist $sentences ein Array, ja; ein Array von Strings.
              Durch das foreach „wird“ nichts zu Strings, es durchläuft einfach das Array, und gibt dir ein Element nach dem anderen – die hier zufälliger Weise Strings sind.
              Nun kann ich aber mit in_array nur Array's miteinander vergleichen.
              Nein. in_array überprüft, ob ein bestimmter Wert in einem Array als Element vorhanden ist.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Zitat von SusiSorglos Beitrag anzeigen
                Ich habe es vorhin mal probiert, dabei bin ich folgendermaßen vorgegangen
                PHP-Code:
                function sentence_case($string) {
                    
                $sentences preg_split('/([ ]+)/'$string, -1PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
                    
                $new_string '';

                    
                $klein = array("DER""DIE""DAS""UND""IN");
                    
                $gross = array("THC""OCB""OK""MFG");

                    foreach (
                $sentences as $key => $sentence) {
                        if (
                in_array($klein$sentence)) {
                            
                $new_string .= strtolower(trim($sentence)); 
                        }
                        elseif (
                in_array($gross$sentence)) {
                            
                $new_string .= strtolower(trim($sentence)); 
                        }
                        else {
                            
                $new_string .= ucfirst(strtolower(trim($sentence))); 
                        }
                    }
                    return 
                trim($new_string);
                }

                echo 
                sentence_case("OCB DER DIE BLAUES THC IN KÖLN"); 
                Soweit ich das verstehe ist $sentences ein ARRAY. $sentence wird durch die foreach-Schleife zu einem String.
                Nun kann ich aber mit in_array nur Array's miteinander vergleichen.

                Also hier liegt erst einmal mein Problem. Oder sollte ich doch besser preg_replace nutzen und den ganzen foreach Kram weg lassen!?
                Du hast die Parameter von in_array() vertauscht.
                Und zu großzügig mit trim()
                Bei in_array($gross, $sentence) möchtest du upper, nicht lower
                Ansonsten tuts das doch ...
                Wir werden alle sterben

                Kommentar


                • #9
                  Ja Stimmt! Ich habe die Werte getauscht, die TRIM's entfernt und hinter jedem Wort noch ein Leerzeichen eingefügt.

                  Habe jetzt keine Lust mehr, aber werde es morgen mal einbauen und mit realen Wörtern bestücken und testen ob es so funktioniert.

                  THX an alle!!


                  PHP-Code:
                  function sentence_case($string) {
                      
                  $sentences preg_split('/([ ]+)/'$string, -1PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
                      
                  $new_string '';

                      
                  $klein = array("DER""DIE""DAS""UND""IN""IST""NICHT");
                      
                  $gross = array("THC""OCB""OK""MFG");

                      foreach (
                  $sentences as $key => $sentence) {
                          if (
                  in_array($sentence$klein)) {
                              
                  $new_string .= strtolower($sentence)." "
                          }
                          elseif (
                  in_array($sentence$gross)) {
                              
                  $new_string .= strtoupper($sentence)." "
                          }
                          else {
                              
                  $new_string .= ucfirst(strtolower($sentence))." "
                          }
                      }
                      return 
                  trim($new_string);
                  }

                  echo 
                  sentence_case("THC IN OCB IST NICHT OK"); 
                  Zuletzt geändert von SusiSorglos; 25.01.2015, 01:14.
                  PHP 8.0, MariaDB 10.5 auf U20.04

                  Kommentar

                  Lädt...
                  X