首字母大写,其余字母小写

所有,我试图插入一个姓氏到数据库中。 我希望第一个字母的名字大写,如果他们使用两个姓,那么大写第一个和第二个名字。 例如,如果有人input:

已婚的女佣名

它会将其转换为Marriedname Maidenname等等,如果有两个以上的名字。 另一种情况是有人在他们的名字中有一个撇号,所以如果有人进入:

奥康

这将需要转换为O'Connell。 我正在使用:

ucfirst(strtolower($last_name)); 

但是,正如你所看到的那样,对于所有情况都不适用。 感谢您的任何build议!

这将大写所有单词的第一个字母,紧跟在撇号后的字母。 它会使所有其他字母小写。 它应该为你工作:

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

这些都不是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, eg: * 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' 

你可以试试这个字

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

结果是: Dhaka, Jamalpur, Sarishabari

使用这个内置函数:

 ucwords('string'); 

我不相信会有一个很好的答案涵盖你所有的场景。 PHP.net的ucwords论坛有相当多的讨论,但似乎没有一个答案。 我build议你使用大写或单独留下用户的input进行标准化。

你可以用e标志使用preg_replace (执行一个php函数):

 function processReplacement($one, $two) { return $one . strtoupper($two); } $name = "bob o'conner"; $name = preg_replace("/(^|[^a-zA-Z])([az])/e","processReplacement('$1', '$2')", $name); var_dump($name); // output "Bob O'Conner" 

也许正则expression式模式可以改进,但我所做的是:

  • $1是行的开始任何非字母字符。
  • $2是任何小写字母字符

然后我们用简单的processReplacement()函数的结果replace这两个。

如果你有PHP 5.3的话,可能会让processReplacement()成为一个匿名函数。

这是对主要问题的一个更简单,更直接的回答。 下面的函数模仿PHP的方法。 以防万一,如果PHP在将来使用它们的命名空间扩展它,首先检查testing。 我使用这个防水的任何语言在我的wordpress安装。

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

这是Q的第一个字母大写,所有其他小写字母。 如果第三个参数设置为false(默认),则不处理该string的其余部分。

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

/伦德曼

首先转换为标题大小写,然后find第一个撇号,大写NEXT字符。 您将需要添加许多检查,以确保在撇号后面有一个字符,并且此代码只能在一个撇号上工作。 例如“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]); }