Сделать первую букву заглавной, а остальные строчные в строке - PullRequest
41 голосов
/ 05 января 2012

Все, Я пытаюсь вставить фамилию в базу данных. Я хотел бы, чтобы первая буква была написана заглавными буквами для имени, и если они использовали две фамилии, то заглавные буквы первого и второго имён. Так, например, если кто-то вводит:

фамилия, фамилия

Это преобразовало бы это в Marriedname Maidenname и так далее, если есть более двух имен. Другой сценарий: у кого-то есть апостроф в имени, поэтому есть ли возможность сделать это, если кто-то введет:

О'Коннелл

Это нужно будет преобразовать в О'Коннелл. Я использовал:

ucfirst(strtolower($last_name));

Однако, как вы можете заметить, это не сработает для всех сценариев. Спасибо за любой совет!

Ответы [ 10 ]

34 голосов
/ 05 января 2012

Это заглавные буквы всех слов и букв сразу после апострофа.Все остальные буквы будут строчными.Это должно работать для вас:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name))));
22 голосов
/ 06 января 2015

вы можете попробовать это для слова

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

результат: Dhaka, Jamalpur, Sarishabari

21 голосов
/ 23 июля 2013

Ни один из них не подходит для UTF8, так что вот тот, который работает безупречно (пока)

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;
}

Использование:

$s = 'SÃO JOÃO DOS SANTOS';
$v = titleCase($s); // 'São João dos Santos' 
5 голосов
/ 14 марта 2013

Используйте эту встроенную функцию:

ucwords('string');
2 голосов
/ 05 января 2012

Я не верю, что будет один хороший ответ, который охватит все сценарии для вас.На форуме PHP.net для ucwords обсуждается довольно много вопросов, но ни у одного из них нет ответа на все вопросы.Я бы порекомендовал вам стандартизировать, используя только заглавные буквы или оставив только пользовательский ввод.

1 голос
/ 27 ноября 2013

Это немного более простой и более прямой ответ на главный вопрос. Функция ниже имитирует подходы PHP. На всякий случай, если PHP расширит это своими пространствами имен в будущем, сначала проверяется тест. Я использую это доказательство воды для любых языков в моих установках WordPress.

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

Это делает первую букву заглавной и всех остальных строчных букв, как Q был. Если для третьего аргумента установлено значение false (по умолчанию), остальная часть строки не обрабатывается.

// 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;
}

}

/ Лундман

1 голос
/ 05 января 2012

Вы можете использовать preg_replace с флагом e (выполнить функцию 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"

Возможно, шаблон регулярного выражения можно улучшить, но я сделал следующее:

  • $1 является либо началом строки , либо любым не алфавитным символом.
  • $2 является любым строчным буквенным символом

Затем мы заменяем оба из них на результат простой функции processReplacement().

Если у вас PHP 5.3, возможно, стоит сделать processReplacement() анонимной функцией.

0 голосов
/ 23 августа 2018

Вы можете использовать функции strtolower и ucwords в PHP.

Первое: уменьшить весь вводимый текст, используя strtolower('inputtedtext') then capitalise all text using ucwords ('strtolower') `.

Пример:

$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;

Результат = Это какой-то текст

Вы можете использовать для этого однострочный код с ucwords(strtolower($text));

0 голосов
/ 29 ноября 2017

используйте вот так ucfirst(strtolower($var));

0 голосов
/ 05 января 2012

Сначала преобразуйте в заглавный регистр, затем найдите первый апостроф и заглавные буквы в СЛЕДУЮЩЕМ символе.Вам нужно будет добавить много проверок, чтобы убедиться, что после апострофа есть символ, и этот код будет работать только с одним апострофом.например, "Мэри О'Каллахан О'Коннелл".

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