【问题标题】:Make first letter of each word/name uppercase, unless a known all-lowercase component of a surname [duplicate]将每个单词/名称的第一个字母大写,除非姓氏的已知全小写部分[重复]
【发布时间】:2011-01-20 09:29:12
【问题描述】:
我使用 PHP 将表单条目插入 MySQL 数据库。有时用户输入全部大写的文本。有什么办法可以改变它,使只有第一个字母大写? ucwords(strtolower($word)) 对我不起作用,因为如果第一个字母还没有大写,我不想大写它。
我主要关心的是人们何时提交他们的姓氏。大多数人正确提交,但有些人以全部大写形式提交。如果全部大写,它应该和ucwords(strtolower($word)) 一样工作,但是如果有人提交他们的名字为De la Rosa,我不希望它更改为De La Rosa。
【问题讨论】:
标签:
php
string
title-case
humanize
【解决方案1】:
<?php
function ucwordsreplace($matches) {
return ucwords(strtolower($matches[0]));
}
$original = "some UPPERCASE words GO HERE";
$fixed = preg_replace_callback('/\b[A-Z]+\b/', "ucwordsreplace", $original);
echo $fixed; // some Uppercase words Go Here
正则表达式只匹配完全大写的单词(任意数量的大写字母,每边都有一个单词边界),然后将每个单词传递给定义的函数,该函数返回一个替换文本,只有第一个字母大写。
如果您还想阻止像 UPPERCA$E 这样的事情,那么您可以在正则表达式中添加其他符号,或者甚至只匹配所有非小写字符(使用 [^a-z] 而不是 [A-Z])。
【解决方案2】:
我认为你表示的功能是正确的..
但是你的具体要求是什么..
下面以ucwords的用法为例
<?php
$foo = 'hello world!';
$foo = ucwords($foo); // Hello World!
$bar = 'HELLO WORLD!';
$bar = ucwords($bar); // HELLO WORLD!
$bar = ucwords(strtolower($bar)); // Hello World!
?>
如果你只希望第一个是大写而不是字符串的每个第一个字符
要大写,然后尝试 ucfirst() 函数。
【解决方案3】:
ucfirst(strtolower($word));