简单的多字节 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
的第一个字符大写,如果该字符是 ASCII 字符,范围在 "a"
(0x61) 到 "z"
(0x7a) 之间。
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
?>
针对“多词”字符串的多字节 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
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?"
?>
这是一个将姓名片段大写,并将其余部分小写的函数。您可以传递要使用的分隔符字符。
例如 <?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 个字符的示例是 ALLCAPS,因此将 $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);
}
对于想要将句子中每个词的首字母大写的任何人,这对我有用
<?php
function ucfirst_sentence($str)
{
return preg_replace('/\b(\w)/e', 'strtoupper("$1")', $str);
}
?>
如果你想对 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。
对于使用 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
/**
* ucfirst UTF-8 兼容函数
*
* @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;
}
?>
斯维托斯拉夫·马里诺夫
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.
?>
将下面函数组合起来,使能在共享主机环境(无法始终依赖于 mbstring 的安装)中对多字节字符串启用 ucfirst
<?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。
注意:此函数的返回值在版本 4.3 中发生了变化,当传递一个长度为 0 的字符串时。在 <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)) // 简单 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;
}
如果你需要一个法语版本的 ucfirst
"été indien" => "Eté indien"
"ça va?" => "Ça va?"
<?php
function frenchUcfirst($v) {
$lowCase = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF";
$lowCase .= "\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFF\\u0161";
$upperCase = "AAAAAA\\xC7EEEEIIIINOOOOOOUUUUYYS";
return strtoupper(strtr(substr($v, 0, 1), $lowCase, $upperCase)) . substr($v, 1);
}
?>
注意
- 拉丁语非法语重音字符遵循相同的规则
"ändå" => "Andå"
- 函数中的非 ASCII 字符采用十六进制格式,以避免编码问题...
以下是如何在用户空间实现 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() )