web-dev-qa-db-fra.com

Mettre la première lettre en majuscule et le reste en minuscule dans une chaîne

Tous, je m'efforce d'insérer un nom de famille dans une base de données. Je voudrais que la première lettre soit en majuscule pour le nom et s’ils ont utilisé deux noms de famille, en majuscule les premier et deuxième noms Ainsi, par exemple, si quelqu'un entre:

nom marie maidenname

Cela le convertirait en nom de famille Maidenname et ainsi de suite s'il y a plus de deux noms. L'autre scénario est que quelqu'un a une apostrophe dans son nom, est-il donc possible de le faire si quelqu'un entre:

o'Connell

Cela aurait besoin de convertir en O'Connell. J'utilisais:

ucfirst(strtolower($last_name));

Cependant, comme vous pouvez le constater, cela ne fonctionnerait pas pour tous les scénarios. Merci pour tout conseil! 

39
user1048676

Cela mettra en majuscule toutes les premières lettres de Word et les lettres immédiatement après une apostrophe. Toutes les autres lettres seront en minuscule. Il devrait fonctionner pour vous:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name))));
34
Paulpro

vous pouvez essayer ceci pour Word 

<?php echo ucwords(strtolower('Dhaka, JAMALPUR, sarishabari')) ?>

le résultat est: Dhaka, Jamalpur, Sarishabari

22
user4382407

Aucune d'entre elles n'est compatible avec UTF8, alors voici celle qui fonctionne parfaitement

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("and", "to", "of", "das", "dos", "I", "II", "III", "IV", "V", "VI"))
{
    /*
     * Exceptions in lower case are words you don't want converted
     * Exceptions all in upper case are any words you don't want converted to title case
     *   but should be converted to upper case, e.g.:
     *   king henry viii or king henry Viii should be King Henry VIII
     */
    $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
    foreach ($delimiters as $dlnr => $delimiter) {
        $words = explode($delimiter, $string);
        $newwords = array();
        foreach ($words as $wordnr => $Word) {
            if (in_array(mb_strtoupper($Word, "UTF-8"), $exceptions)) {
                // check exceptions list for any words that should be in upper case
                $Word = mb_strtoupper($Word, "UTF-8");
            } elseif (in_array(mb_strtolower($Word, "UTF-8"), $exceptions)) {
                // check exceptions list for any words that should be in upper case
                $Word = mb_strtolower($Word, "UTF-8");
            } elseif (!in_array($Word, $exceptions)) {
                // convert to uppercase (non-utf8 only)
                $Word = ucfirst($Word);
            }
            array_Push($newwords, $Word);
        }
        $string = join($delimiter, $newwords);
   }//foreach
   return $string;
}

Usage:

$s = 'SÃO JOÃO DOS SANTOS';
$v = titleCase($s); // 'São João dos Santos' 
21
Antonio Max

Utilisez cette fonction intégrée:

ucwords('string');
4
jalalkhan121

Je ne crois pas qu'il y aura une bonne réponse qui couvre tous les scénarios pour vous. Le forum PHP.net pour ucwords a pas mal de discussions, mais aucune ne semble avoir de réponse pour tous. Je recommanderais que vous normalisiez l'utilisation de majuscules ou de laisser la saisie de l'utilisateur seule.

2
Steve Orman

Vous pouvez utiliser preg_replace avec l'indicateur e (exécuter une fonction php):

function processReplacement($one, $two)
{
  return $one . strtoupper($two);
}

$name = "bob o'conner";
$name = preg_replace("/(^|[^a-zA-Z])([a-z])/e","processReplacement('$1', '$2')", $name);

var_dump($name); // output "Bob O'Conner"

Peut-être que le motif de regex pourrait être amélioré, mais ce que j'ai fait est:

  • $1 est le début de la ligne ou tout caractère non alphabétique.
  • $2 est un caractère alphabétique minuscule

Nous remplaçons ensuite les deux par le résultat de la fonction processReplacement() simple.

Si vous avez PHP 5.3, cela vaut probablement la peine de faire de processReplacement() une fonction anonyme.

1
Abhi Beckert

C'est une réponse un peu plus simple et plus directe à la question principale. la fonction ci-dessous imite les approches PHP. Juste au cas où si PHP étendait cela avec leurs espaces de noms à l'avenir, un test est d'abord vérifié. J'utilise cette preuve de l'eau pour toutes les langues dans mes installations wordpress.

$str = mb_ucfirst($str, 'UTF-8', true);

Cela met la première lettre en majuscule et toutes les autres minuscules comme le Q l'était. Si le troisième argument est défini sur false (valeur par défaut), le reste de la chaîne n'est pas manipulé.

// Extends PHP
if (!function_exists('mb_ucfirst')) {

function mb_ucfirst($str, $encoding = "UTF-8", $lower_str_end = false) {
    $first_letter = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding);
    $str_end = "";
    if ($lower_str_end) {
        $str_end = mb_strtolower(mb_substr($str, 1, mb_strlen($str, $encoding), $encoding), $encoding);
    } else {
        $str_end = mb_substr($str, 1, mb_strlen($str, $encoding), $encoding);
    }
    $str = $first_letter . $str_end;
    return $str;
}

}

/ Lundman

1
Jonas Lundman

utiliser comme ceci ucfirst(strtolower($var));

0
chgav007

Vous pouvez utiliser les fonctions strtolower et ucwords en PHP.

Premièrement: réduisez tout le texte saisi en utilisant strtolower('inputtedtext') then capitalise all text usingucwords ('strtolower') `.

Échantillon : 

$text = 'tHis iS sOme tEXt'; <br>
$lower = strtolower($text); &ensp; //this will lower all letter from the text <br>
$upper = ucwords($lower); &ensp; //this will uppercase all first letter from the text <br>

echo $upper;

Résultat = Ceci est du texte

Vous pouvez utiliser un code de ligne pour cela avec ucwords(strtolower($text));

0
Irfan Dona

Commencez par convertir en titre, puis recherchez la première apostrophe et mettez en majuscule le caractère NEXT. Vous devrez ajouter de nombreux contrôles pour vous assurer qu'il y a un caractère après l'apostrophe et que ce code ne fonctionnera que sur une seule apostrophe. par exemple. "Mary O'Callahan O'connell". 

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
$pos = strpos($str, "'");
if ($pos != FALSE)
{
     $str[$pos+1] = strtoupper($str[$pos+1]);
}
0
Fletch