У меня есть тексты в UTF-8 с диакритическими символами, и я хотел бы проверить, есть ли первая буква этого текста в верхнем регистре или в нижнем регистре. Как это сделать?
Как проверить, является ли письмо верхним или нижним в PHP?
Ответ 1
По моему мнению, вызов preg_
является наиболее прямым, лаконичным и надежным вызовом по сравнению с другими опубликованными здесь решениями.
echo preg_match('~^\p{Lu}~u', $string) ? 'upper' : 'lower';
Моя разбивка паттернов:
~ # starting pattern delimiter
^ #match from the start of the input string
\p{Lu} #match exactly one uppercase letter (unicode safe)
~ #ending pattern delimiter
u #enable unicode matching
Пожалуйста, обратите внимание, когда ctype_
и < 'a'
терпят неудачу с этой батареей тестов.
Код: (Демо)
$tests = ['âa', 'Bbbbb', 'Éé', 'iou', 'Δδ'];
foreach ($tests as $test) {
echo "\n{$test}:";
echo "\n\tPREG: " , preg_match('~^\p{Lu}~u', $test) ? 'upper' : 'lower';
echo "\n\tCTYPE: " , ctype_upper(mb_substr($test, 0, 1)) ? 'upper' : 'lower';
echo "\n\t< a: " , mb_substr($test, 0, 1) < 'a' ? 'upper' : 'lower';
$chr = mb_substr ($test, 0, 1, "UTF-8");
echo "\n\tMB: " , mb_strtoupper($chr, "UTF-8") == $chr ? 'upper' : 'lower';
}
Выход:
âa:
PREG: lower
CTYPE: lower
< a: lower
MB: lower
Bbbbb:
PREG: upper
CTYPE: upper
< a: upper
MB: upper
Éé: <-- trouble
PREG: upper
CTYPE: lower <-- uh oh
< a: lower <-- uh oh
MB: upper
iou:
PREG: lower
CTYPE: lower
< a: lower
MB: lower
Δδ: <-- extended beyond question scope
PREG: upper <-- still holding up
CTYPE: lower
< a: lower
MB: upper <-- still holding up
Если кому-то нужно провести различие между заглавными буквами, строчными буквами и не буквами, см. Этот пост.
Ответ 2
function starts_with_upper($str) {
$chr = mb_substr ($str, 0, 1, "UTF-8");
return mb_strtolower($chr, "UTF-8") != $chr;
}
Обратите внимание, что mb_substr необходимо правильно изолировать первый символ.
Ответ 3
Используйте ctype_upper
для проверки верхнего регистра:
$a = array("Word", "word", "wOrd");
foreach($a as $w)
{
if(ctype_upper($w{0}))
{
print $w;
}
}
Ответ 4
Пробовал?
$str = 'the text to test';
if($str{0} === strtoupper($str{0})) {
echo 'yepp, its uppercase';
}
else{
echo 'nope, its not upper case';
}
Ответ 5
Я не хотел, чтобы числа и другие были верхними char, поэтому я использую:
if(preg_match('/[A-Z]$/',$char)==true)
{
// this must be an upper char
echo $char
}
Ответ 6
Как используется в функции автозагрузчика Kohana 2:
echo $char < 'a' ? 'uppercase' : 'lowercase';
Когда строковый символ передается в целое число, он вычисляет его номер ASCII. Как вы знаете, в таблице ASCII сначала есть некоторые контрольные символы и другие. Затем прописные буквы латинского алфавита. А затем строчные буквы латинского алфавита. Таким образом, вы можете легко проверить, меньше ли код буквы или больше, чем малый латинский символ a
.
Кстати, это примерно в два раза быстрее, чем решение с регулярными выражениями.
Ответ 7
Обратите внимание, что PHP предоставляет семейство ctype
, например ctype_upper.
Сначала вы должны установить локаль правильно setLocale(), чтобы заставить ее работать с UTF-8.
См. Комментарий ctype_alpha, например.
Использование:
if ( ctype_upper( $str[0] )) {
// deal with 1st char of $str is uppercase
}
Ответ 8
Как насчет:
if (ucfirst($string) == $string) {dosomething();}
Ответ 9
Если вы хотите, чтобы это было в хорошей функции, я использовал это:
function _is_upper ($in_string)
{
return($in_string === strtoupper($in_string) ? true : false);
}
Затем просто позвоните..
if (_is_upper($mystring))
{
// Do....
}
Ответ 10
if(ctype_upper(&value)){
echo 'uppercase';
}
else {
echo 'not upper case';
}