Как проверить, является ли буква выше или ниже в PHP? - PullRequest
37 голосов
/ 12 мая 2010

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

Ответы [ 10 ]

43 голосов
/ 12 мая 2010
function starts_with_upper($str) {
    $chr = mb_substr ($str, 0, 1, "UTF-8");
    return mb_strtolower($chr, "UTF-8") != $chr;
}

Обратите внимание, что mb_substr необходим для правильной изоляции первого символа.

25 голосов
/ 07 июня 2011

Используйте ctype_upper для проверки верхнего регистра:

$a = array("Word", "word", "wOrd");

foreach($a as $w)
{
    if(ctype_upper($w{0}))
    {
        print $w;
    }
}
11 голосов
/ 12 мая 2010

пробовал?

$str = 'the text to test';
if($str{0} === strtoupper($str{0})) {
   echo 'yepp, its uppercase';
}
else{
   echo 'nope, its not upper case';
}
5 голосов
/ 14 мая 2013

Как используется в функции автозагрузчика Kohana 2:

echo $char < 'a' ? 'uppercase' : 'lowercase';

Когда строковый символ приводится к целому числу, он оценивается как его номер ASCII. Как вы знаете, в таблице ASCII сначала есть некоторые управляющие символы и другие. Затем заглавные буквы от латинского алфавита. А потом строчные буквы от латинского алфавита. Таким образом, вы можете легко проверить, является ли код буквы меньше или больше маленького латинского символа a.

Кстати, это примерно в два раза быстрее, чем решение с регулярными выражениями.

5 голосов
/ 01 февраля 2011

Я не хотел, чтобы числа и другие были верхним символом, поэтому я использую:

if(preg_match('/[A-Z]$/',$char)==true)
{
   // this must be an upper char
   echo $char
}
4 голосов
/ 22 ноября 2010

Обратите внимание, что PHP предоставляет семейство ctype, такое как ctype_upper .

. Сначала необходимо правильно установить локаль с помощью setLocale () , чтобы она заработалас UTF-8.См. Комментарий к ctype_alpha , например.

Использование:

if ( ctype_upper( $str[0] )) {
    // deal with 1st char of $str is uppercase
}
3 голосов
/ 05 мая 2019

По моему мнению, вызов 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 голосов
/ 21 июля 2011

А как же просто:

if (ucfirst($string) == $string) {dosomething();}
1 голос
/ 19 января 2013
if(ctype_upper(&value)){
    echo 'uppercase';
}
else {
    echo 'not upper case';
}
1 голос
/ 30 июля 2011

Если вы хотите это в хорошей функции, я использовал это:

function _is_upper ($in_string)
{
    return($in_string === strtoupper($in_string) ? true : false);
}

Тогда просто позвоните ..

if (_is_upper($mystring))
{
  // Do....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...