Прописные буквы — PHP заглавная буква первой буквы из алфавита

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');
}

-2

Решение

скучно:

<?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
1

Другие решения

Попробуй это

  $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;
0