2016-05-19 9 views
-2

ucwords и ucfirst преобразовать первый символ из строки в верхний регистр.PHP Заглавная буква из ALPHABET

Мне нужна функция, чтобы использовать первый символ из алфавита.

например: ¡hi! -> Привет! «h» должен быть капиталом, потому что это первый символ, присутствующий в алфавите.

На испанском языке У нас есть вопросительные знаки в начале и конце слова/предложения/фразы, поэтому заглавные буквы первого символа с использованием ucword/ucfirst не решили мою проблему. Мне нужно загладить первый символ алфавита из строки.

¿Какой у вас любимый вид спорта? -> после ucfirst -> ¿Какой твой любимый вид спорта?

Желаемый результат:

¿Ваш любимый вид спорта?

/////// ------------------ /////// UPDATE /////// ------ ------------ ///////

Спасибо за ответ, я смог изменить его и получить окончательную функцию.

Эта функция заглавной первую букву алфавита (в том числе это акцентированных испанский гласными á é ó í U)

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

Положите еще несколько примеров, и причина, чтобы сделать это, почему вы хотите это? И ваша попытка? – C2486

+0

Возможно, сначала разделите слово, затем отделите строку от несимвольного символа, затем выполните метод ucfirst. – claudios

+0

Может быть: Удалить все, что не является символом в алфавите, и использовать первое из них? –

ответ

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 
+0

. Ctype_alpha не возвращает true, если гласный имеет знак акцента, такой как – Diego

+0

, ctype_alpha не возвращает true, если гласный имеет знак акцента, такой как á é í ó ú. Это нормально? 'if (preg_match ('/^\ p {L} * $ /', utf8_decode ('holá'))) { echo 'is alpha'; } ' – Diego

+0

@ DIEGOF.G.если вы правильно установите' setLocale() ', тогда' ctype_alpha' будет работать. И это должно быть быстрее –

0

Попробуйте

$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

использовать заголовок ('Content-type: text/html; charset = utf-8'); $ a = strtolower ("¡hi!"); для ввода – Akshath

+0

Почему вы скопировали мой код? –

+0

i dont копировать ваш код, способ был другим – Akshath

 Смежные вопросы

  • Нет связанных вопросов^_^