简单的多字节 ucfirst()
<?php
function my_mb_ucfirst($str) {
$fc = mb_strtoupper(mb_substr($str, 0, 1));
return $fc.mb_substr($str, 1);
}
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
ucfirst — 将字符串的第一个字符大写
如果 string
的第一个字符是范围在 "a"
(0x61) 到 "z"
(0x7a) 之间的 ASCII 字符,则返回一个字符串,其中该字符串的第一个字符大写。
string
输入字符串。
返回结果字符串。
版本 | 描述 |
---|---|
8.2.0 | 大小写转换不再依赖于使用 setlocale() 设置的区域设置。仅转换 ASCII 字符。 |
示例 #1 ucfirst() 示例
<?php
$foo = 'hello world!';
$foo = ucfirst($foo); // Hello world!
$bar = 'HELLO WORLD!';
$bar = ucfirst($bar); // HELLO WORLD!
$bar = ucfirst(strtolower($bar)); // Hello world!
?>
简单的多字节 ucfirst()
<?php
function my_mb_ucfirst($str) {
$fc = mb_strtoupper(mb_substr($str, 0, 1));
return $fc.mb_substr($str, 1);
}
?>
我相信 mb_ucfirst 很快就会在 PHP 中添加,但现在这可能很有用
<?php
if (!function_exists('mb_ucfirst') && function_exists('mb_substr')) {
function mb_ucfirst($string) {
$string = mb_strtoupper(mb_substr($string, 0, 1)) . mb_substr($string, 1);
return $string;
}
}
?>
它还检查 mb 支持是否已启用。
由于多字节字符,将此函数用于土耳其语将无法工作。但是您可以使用一些技巧
<?php
function ucfirst_tr($str) {
$trMap = ['Ğ'=>'ğ','Ü'=>'ü','Ş'=>'ş','İ'=>'i','Ö'=>'ö','Ç'=>'ç','I'=>'ı'];
$str = mb_strtolower(strtr($str, $trMap));
$first = mb_substr($str, 0, 1);
$first = strtr($first, array_flip($trMap));
$first = mb_strtoupper($first);
return $first . mb_substr($str, 1);
}
?>
正确的土耳其语解决方案;
<?php
function ucfirst_turkish($str) {
$tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
return mb_convert_case(
str_replace("i", "İ", $tmp[0]), MB_CASE_TITLE, "UTF-8").
$tmp[1];
}
$str = "iyilik güzelLİK";
echo ucfirst($str) ."\n"; // Iyilik güzelLİK
echo ucfirst_turkish($str); // İyilik güzelLİK
?>
这是我用于将字符串转换为句子大小写的内容
<?php
function sentence_case($string) {
$sentences = preg_split('/([.?!]+)/', $string, -1, PREG_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);
}
print sentence_case('HMM. WOW! WHAT?');
// 输出: "Hmm. Wow! What?"
?>
针对“多词”字符串实现多字节 ucfirst 函数(需要 mbstring 模块)
<?php
public static function ucfirst($str)
{
$str = mb_strtolower($str);
$words = preg_split('/\b/u', $str, -1, PREG_SPLIT_NO_EMPTY);
foreach ($words as $word) {
$ucword = mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1);
$str = str_replace($word, $ucword, $str);
}
return $str;
}
?>
这是一个用于将姓名部分大写,并将其余部分转换为小写的函数。您可以传递您想要用作分隔符的字符。
例如 <?php echo nameize("john o'grady-smith"); ?>
返回 John O'Grady-Smith
<?php
function nameize($str,$a_char = array("'","-"," ")){
//$str 包含完整的原始姓名字符串
//$a_char 是一个包含我们用作大写分隔符的字符的数组。如果您不传递任何内容,则默认为三个。
$string = strtolower($str);
foreach ($a_char as $temp){
$pos = strpos($string,$temp);
if ($pos){
//我们处于循环中,因为我们在数组中找到了一个特殊字符,所以让我们将其分成块并使每个块都大写。
$mend = '';
$a_split = explode($temp,$string);
foreach ($a_split as $temp2){
//将每个在特殊字符处分隔的字符串部分大写
$mend .= ucfirst($temp2).$temp;
}
$string = substr($mend,0,-1);
}
}
return ucfirst($string);
}
?>
这是针对土耳其语字母的修正函数。
<?php
function uc_first($str){
$str[0] = strtr($str,
"abcdefgh?ijklmnopqrstuvwxyz".
"\x9C\x9A\xE0\xE1\xE2\xE3".
"\xE4\xE5\xE6\xE7\xE8\xE9".
"\xEA\xEB\xEC\xED\xEE\xEF".
"\xF0\xF1\xF2\xF3\xF4\xF5".
"\xF6\xF8\xF9\xFA\xFB\xFC".
"\xFE\xFF",
"ABCDEFGHI?JKLMNOPQRSTUVWXYZ".
"\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
"\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
"\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
"\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
"\xDB\xDC\xDE\x9F");
return $str;
}
?>
改进的句子首字母大写方法。
前两个操作(双空格和全部大写)是可选的,因此可以安全地移除。
<?php
// 返回句子首字母大写的字符串
function ucsentence($str) {
if ($str) { // 输入
$str = preg_replace('/'.chr(32).chr(32).'+/', chr(32), $str); // 递归地将所有双空格替换为空格
if (($x = substr($str, 0, 10)) && ($x == strtoupper($x))) $str = strtolower($str); // 前 10 个字符的样本为全部大写,因此将 $str 转换为小写;如果始终执行此操作,则任何正确的首字母大写都会丢失
$na = array('. ', '! ', '? '); // 标点符号查找表
foreach ($na as $n) { // 每个标点符号查找表
if (strpos($str, $n) !== false) { // 找到标点符号查找表
$sa = explode($n, $str); // 分割
foreach ($sa as $s) $ca[] = ucfirst($s); // 大写
$str = implode($n, $ca); // 用重建版本替换 $str
unset($ca); // 清理以供下一次循环使用
}
}
return ucfirst(trim($str)); // 如果未找到标点符号查找表,则将第一个字母大写
}
}
?>
"heLLo EarthLing!" >> "HeLLo EarthLing!"
"I'M MOSTLY. caps! " >> "I'm mostly. Caps!"
"ALLCAPS" >> "Allcaps"
"i haVe neST.ed punct,u.ation! sp A c es. and CAPs.. " >> "I haVe neST.ed punct,u.ation! Sp A c es. And CAPs.."
我做了一个小的改动。现在它可以处理数字中的点。
function ucsentence ($string){
$string = explode ('.', $string);
$count = count ($string);
for ($i = 0; $i < $count; $i++){
$string[$i] = ucfirst (trim ($string[$i]));
if ($i > 0){
if ((ord($string[$i]{0})<48) || (ord($string[$i]{0})>57)) {
$string[$i] = ' ' . $string[$i];
}
}
}
$string = implode ('.', $string);
return $string;
}
我的版本,将字符串中第一个单词的首字母转换为大写
public function mb_ucfirst($str) {
$aParts = explode(" ",$str);
$firstWord = mb_convert_case($aParts[0],MB_CASE_TITLE,"UTF-8");
unset($aParts[0]);
return $firstWord." ".implode(" ",$aParts);
}
如果你想对utf8使用ucfirst,试试这个
<?php
function ucfirst_utf8($stri){
if($stri{0}>="\xc3")
return (($stri{1}>="\xa0")?
($stri{0}.chr(ord($stri{1})-32)):
($stri{0}.$stri{1})).substr($stri,2);
else return ucfirst($stri);
}
?>
它很快,不依赖于语言(但依赖于utf8),并且不使用任何mb函数,例如mb_ucfirst。
对于任何想要将句子中的每个单词都转换为首字母大写的人,这个方法对我有用
<?php
function ucfirst_sentence($str)
{
return preg_replace('/\b(\w)/e', 'strtoupper("$1")', $str);
}
?>
对于使用utf-8编码的立陶宛语文本,我使用两个函数(感谢[mattalexxpub at gmail dot com]和Svetoslav Marinov)
<?php
function my_ucfirst($string, $e ='utf-8') {
if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
$string = mb_strtolower($string, $e);
$upper = mb_strtoupper($string, $e);
preg_match('#(.)#us', $upper, $matches);
$string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
}
else {
$string = ucfirst($string);
}
return $string;
}
function sentence_case($string) {
$sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
$new_string = '';
foreach ($sentences as $key => $sentence) {
$new_string .= ($key & 1) == 0?
my_ucfirst(strtolower(trim($sentence))) :
$sentence.' ';
}
return trim($new_string);
}
?>
格式化输入字符串
<?php
function ucsentences($string){
$parts = preg_split('/([^\.\!\?;]+[\.\!\?;"]+)/', strtolower($string), (-1), PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
$r = '';
foreach($parts as $key=>$sentence){
$r .= ucfirst(trim($sentence)) . ' ';
}
$r = preg_replace('/\bi\b/', 'I', $r);
$r = preg_replace_callback('/("[a-z])/', function($m){ return strtoupper($m[0]);}, $r);
return rtrim($r);
}
$str = 'i\'m not sure. if this is good enough, but i thought: "hey, who know\'s. maybe i am right."';
?>
输出
I'm not sure. If this is good enough, but I thought: "Hey, who know's. Maybe I am right."
土耳其语解决方案
<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
function tr_ilkbuyuk($text)
{
$text = str_replace("I","ı",$text);
$text = mb_strtolower($text, 'UTF-8');
if($text[0] == "i")
$tr_text = "İ".substr($text, 1);
else
$tr_text = mb_convert_case($text, MB_CASE_TITLE, "UTF-8");
return trim($tr_text);
}
function tr_ucwords($text)
{
$p = explode(" ",$text);
if(is_array($p))
{
$tr_text = "";
foreach($p AS $item)
$tr_text .= " ".tr_ilkbuyuk($item);
return trim($tr_text);
}
else
return tr_ilkbuyuk($text);
}
$deger = "ıişllşlsdg";
echo tr_ucwords($deger);
?>
plemieux 的函数在我没有将编码传递给每个mb函数的情况下无法正常工作(尽管在脚本顶部使用了ini_set('default_charset', 'utf-8'))。这是在我的应用程序(PHP 4.3)中有效的示例
<?php
function my_mb_ucfirst($str, $e='utf-8') {
$fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
}
?>
出于某种原因,这对我有用。
Mac OS 10.5.1
PHP 5.2.6
<?php
/**
* 支持 UTF-8 的 ucfirst 函数
*
* @param string $string
* @return string
* @see http://ca.php.net/ucfirst
*/
function my_ucfirst($string, $e ='utf-8') {
if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
$string = mb_strtolower($string, $e);
$upper = mb_strtoupper($string, $e);
preg_match('#(.)#us', $upper, $matches);
$string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
} else {
$string = ucfirst($string);
}
return $string;
}
?>
Svetoslav Marinov
http://slavi.biz
用于对 utf-8 编码的西里尔文本使用 ucfirst 的简单函数
<?php
public function capitalize_first($str) {
$line = iconv("UTF-8", "Windows-1251", $str); // 转换为 windows-1251
$line = ucfirst($line);
$line = iconv("Windows-1251", "UTF-8", $line); // 转换回 utf-8
return $line;
}
?>
受 lcfirst 函数的启发,一个简单的 mb_lcfirst 函数来处理多字节字符串
<?php
function mb_lcfirst($str, $enc = null)
{
if($enc === null) $enc = mb_internal_encoding();
return mb_strtolower(mb_substr($str, 0, 1, $enc), $enc).mb_substr($str, 1, mb_strlen($str, $enc), $enc);
}
?>
Ken 和 zee
为了使这个函数更通用,我会在你的 $sentence 变量周围添加 strtolower() 函数。这样做将允许你转换全大写文本块以及全小写文本块。
<?php
function sentence_cap($impexp, $sentence_split) {
$textbad=explode($impexp, $sentence_split);
$newtext = array();
foreach ($textbad as $sentence) {
$sentencegood=ucfirst(strtolower($sentence));
$newtext[] = $sentencegood;
}
$textgood = implode($impexp, $newtext);
return $textgood;
}
$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);
echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.
?>
以下函数的组合,可以在共享主机环境中为多字节字符串启用 ucfirst(在共享主机环境中,你无法始终依赖 mbstring 是否已安装)。
<?php
function my_mb_ucfirst($str, $e='utf-8') {
if (function_exists('mb_strtoupper')) {
$fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
}
else {
$str = utf8_decode($str);
$str[0] = strtr($str[0],
"abcdefghýijklmnopqrstuvwxyz".
"\x9C\x9A\xE0\xE1\xE2\xE3".
"\xE4\xE5\xE6\xE7\xE8\xE9".
"\xEA\xEB\xEC\xED\xEE\xEF".
"\xF0\xF1\xF2\xF3\xF4\xF5".
"\xF6\xF8\xF9\xFA\xFB\xFC".
"\xFE\xFF",
"ABCDEFGHÝIJKLMNOPQRSTUVWXYZ".
"\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
"\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
"\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
"\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
"\xDB\xDC\xDE\x9F");
return utf8_encode($str);
}
}
?>
这是一个简单的代码,用于从文本中删除存储在数据库中的所有“不良词语”。您可以使用 str_ireplace,但由于它仅安装在 PHP5 上,因此此代码也能正常工作。它首先将文本转换为小写,然后在认为应放置大写字母的位置(新句子的开头)使用 ucfirst() 放置大写字母。前一句以“. ”结尾。
<?php
function filter($text){
$filters=mysql_query("SELECT word,result FROM filter");
while($filter=mysql_fetch_array($filters)){
$text=str_replace($filter[word],$filter[result],strtolower($text));
$parts=explode(". ",$text);
for($i=0;$i<count($parts);$i++){
$parts[$i]=ucfirst($parts[$i]);
}
$text=implode(". ",$parts);
}
return $text;
}
?>
啊,最后一个代码被破坏了,这是修复后的代码
<?php
function uc_first($str){
$str[0] = strtr($str,
"abcdefghijklmnopqrstuvwxyz".
"\x9C\x9A\xE0\xE1\xE2\xE3".
"\xE4\xE5\xE6\xE7\xE8\xE9".
"\xEA\xEB\xEC\xED\xEE\xEF".
"\xF0\xF1\xF2\xF3\xF4\xF5".
"\xF6\xF8\xF9\xFA\xFB\xFC".
"\xFD\xFE\xFF",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ".
"\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
"\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
"\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
"\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
"\xDB\xDC\xDD\xDE\x9F");
return $str;
}
?>
因此,此函数还会将其他字母更改为大写,ucfirst() 仅更改:a-z 为:A-Z。
注意:当传递的字符串长度为 0 时,此函数的返回值在 4.3 版中发生了变化。在 <4.2 中返回 false,而在 >4.3 中返回长度为 0 的字符串。
示例
$name = ucfirst("");
var_dump($name);
$name = ucfirst("owen");
var_dump($name);
<4.2 版本的结果
bool(false) string(4) "Owen"
>4.3 版本的结果
string(0) "" string(4) "Owen"
如果您需要对多个分隔符应用相同的操作,您可以使用 preg_replace 将此“第二个分隔符”包含在您的实际分隔符中。
例如,如果您想在一个用于输入全名的输入框中使用类似 Lee 的 FormatName 函数,因为此脚本仅设计为检查姓氏,就好像它是整个字符串一样。问题是您仍然希望支持双姓,并且您仍然希望能够支持如果双姓的第二部分以“mc”开头,它仍然会正确格式化的可能性。
此示例执行了一个 preg_replace,它将分隔符用您的实际分隔符括起来。这只是编写一些更大更花哨的 blah-blah 函数的非常快速的替代方法。如果有更短、更简单的方法,请随时告诉我。(强调更短和更简单,因为这就是重点。):D
这是示例。我已经删除了 Lee 的注释,以免与我自己的注释混淆。
<?php
function FormatName($name=NULL)
{
if (empty($name))
return false;
$name = strtolower($name);
$name = preg_replace("[\-]", " - ",$name); // 将连字符用我们的分隔符括起来,以便我们的 strncmp 准确
if (preg_match("/^[a-z]{2,}$/i",$name)) // 简单地使用 preg_match if 语句
{
$names_array = explode(' ',$name); // 将分隔符设置为空格。
for ($i = 0; $i < count($names_array); $i++)
{
if (strncmp($names_array[$i],'mc',2) == 0 || ereg('^[oO]\'[a-zA-Z]',$names_array[$i]))
{
$names_array[$i][2] = strtoupper($names_array[$i][2]);
}
$names_array[$i] = ucfirst($names_array[$i]);
}
$name = implode(' ',$names_array);
$name = preg_replace("[ \- ]", "-",$name); // 删除我们分隔符的多余实例
return ucwords($name);
}
}
?>
这是一个方便的函数,可以使句子中每个单词的首字母大写。我用它来处理在我的网站上发布的事件标题……我添加了对大写单词和小写单词的例外,以便罗马数字“IV”不会打印为“iv”,并且像“a”、“the”和“of”这样的单词保持小写。
function RemoveShouting($string)
{
$lower_exceptions = array(
"to" => "1", "a" => "1", "the" => "1", "of" => "1"
);
$higher_exceptions = array(
"I" => "1", "II" => "1", "III" => "1", "IV" => "1",
"V" => "1", "VI" => "1", "VII" => "1", "VIII" => "1",
"XI" => "1", "X" => "1"
);
$words = split(" ", $string);
$newwords = array();
foreach ($words as $word)
{
if (!$higher_exceptions[$word])
$word = strtolower($word);
if (!$lower_exceptions[$word])
$word = ucfirst($word);
array_push($newwords, $word);
}
return join(" ", $newwords);
}
简单但可行的解决方案
<?php
mb_internal_encoding("UTF-8"); // 调用函数前设置内部编码
function utf8_ucfirst($str){
preg_match_all("~^(.)(.*)$~u", $str, $arr);
return mb_strtoupper($arr[1][0]).$arr[2][0];
}
?>
@ zee: 这应该可以解决你的!、?以及任何你想添加的标点符号问题。可能还可以稍微优化一下。
<?php
function sentence_cap($impexp, $sentence_split) {
$textbad=explode($impexp, $sentence_split);
$newtext = array();
foreach ($textbad as $sentence) {
$sentencegood=ucfirst($sentence);
$newtext[] = $sentencegood;
}
$textgood = implode($impexp, $newtext);
return $textgood;
}
$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);
echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.
?>
一些适用于西里尔字母和拉丁字母的简单函数
function rucfirst($str) {
if(ord(substr($str,0,1))<192) return ucfirst($str);
else
return chr(ord(substr($str,0,1))-32).substr($str,1);
}
如果PHP有一个名为ucsentence的内置函数,你就会期望它能提供这样的功能。
function ucsentence ($string){
$string = explode ('.', $string);
$count = count ($string);
for ($i = 0; $i < $count; $i++){
$string[$i] = ucfirst (trim ($string[$i]));
if ($i > 0){
$string[$i] = ' ' . $string[$i];
}
}
$string = implode ('.', $string);
return $string;
}
以下是mb_ucfirst在用户空间中的实现方式
<?php
function mb_ucfirst(string $str, string $encoding = null): string
{
if ($encoding === null) {
$encoding = mb_internal_encoding();
}
return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
}
?>
(当我写这条评论时,其他所有人的尝试都由于这样或那样的原因而失败了,例如:有些不允许你指定编码,有些默认使用utf-8而不是默认使用mb_internal_encoding())