ucwords и ucfirst преобразуют первый символ из строки в верхний регистр.
Мне нужна функция, чтобы заглавные буквы первого символа из алфавита.
например: ¡Привет! -> Привет!
буква «h» должна быть заглавной, потому что это первый символ, присутствующий в алфавите.
На испанском языке у нас есть вопросительные знаки в начале и конце слова / предложения / фразы, поэтому использование первого символа ucword / ucfirst с заглавными буквами не решило мою проблему. Мне нужно использовать первый символ алфавита из строки.
какой твой любимый спорт? -> после ucfirst -> ¿какой твой любимый вид спорта?
Желаемый результат:
Какой твой любимый спорт?
///////——————/////// ОБНОВИТЬ ///////———- ——— ///////
Спасибо за ответ, я смог изменить его и получить окончательную функцию.
Эта функция использует первую букву алфавита (включая эти акцентированные испанские гласные á é í ó ú)
function _ucfirst($palabra) {
$newStr = '';
$match = 0;
foreach(str_split($palabra) as $k=> $letter) {
if($match == 0 && preg_match('/^\p{L}*$/', $letter)){
$newStr .= _ucwords($letter);
break;
}else{
$newStr .= $letter;
}
}
return $newStr.substr($palabra,$k+1);
}
function _ucwords($palabra) {
return mb_convert_case(mb_strtolower($palabra, 'iso-8859-1'), MB_CASE_TITLE, 'iso-8859-1');
}
скучно:
<?php
$str="!34hi Fred hi";
$match=0;//no match yet
$newStr='';//output string
foreach(str_split($str) as $letter){ //split string for loop
if($match==0 && ctype_alpha($letter)){//check its a letter and its the first one we found
$newStr.=strtoupper($letter);//upper case it and glue it
$match=1;// set the match so we don't bother to check any more of the string
}else{
$newStr .=$letter; //glue the rest of the string
}}
echo $newStr; //!34Hi Fred hi
не используйте для длинной строки, лучше разорвать цикл, как только вы нашли первое совпадение, но для короткой строки, которая не должна иметь значения.
Версия с длинной строкой, более эффективная, останавливает цикл при первом совпадении:
<?php$str="!34hi Fred hi";
$newStr='';//output string
foreach(str_split($str) as $k=> $letter){ //split string for loop
if($match==0 && ctype_alpha($letter)){//check its a letter and its the first one we found
$newStr.=strtoupper($letter);//upper case it and glue it
break;//stop the foreach on first find, no need to keep looping
}else{
$newStr .=$letter; //glue the non letters so far found it any
}}
//add the rest of the sting back in
echo $newStr.substr($str,$k+1); //!34Hi Fred hi
Попробуй это
$a=strtolower("!34Hi Fred hi");
$k=0;
$b="";
for($i=0;$i<strlen($a);$i++){
if(ctype_alpha($a[$i])&&$k==0){
$b.=strtoupper($a[$i]);
$k=1;
}else{
$b.=$a[$i];
}
}
echo $b;