Подтвердить что ты не робот

Как проверить, является ли письмо верхним или нижним в PHP?

У меня есть тексты в UTF-8 с диакритическими символами, и я хотел бы проверить, есть ли первая буква этого текста в верхнем регистре или в нижнем регистре. Как это сделать?

4b9b3361

Ответ 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';
}