如何检查PHP中的字母是高还是低?

Tom*_*ski 37 php string utf-8

我的UTF-8文本也有变音字符,并且想检查这个文本的第一个字母是大写还是小写.这该怎么做?

Art*_*cto 45

function starts_with_upper($str) {
    $chr = mb_substr ($str, 0, 1, "UTF-8");
    return mb_strtolower($chr, "UTF-8") != $chr;
}
Run Code Online (Sandbox Code Playgroud)

请注意,mb_substr是正确隔离第一个字符所必需的.

  • 并不总是有效.Unicode字符是大写字母(即Lu类),但没有小写映射.大多数情况下,数学粗体/斜体/双击字母. (3认同)

Eug*_*gen 25

使用ctype_upper的支票大写:

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

foreach($a as $w)
{
    if(ctype_upper($w{0}))
    {
        print $w;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于非拉丁字符,例如北欧ÆØÅ. (3认同)

mic*_*usa 14

我认为,preg_与此处发布的其他解决方案相比,拨打电话是最直接、简洁和可靠的电话。

echo preg_match('~^\p{Lu}~u', $string) ? 'upper' : 'lower';
Run Code Online (Sandbox Code Playgroud)

我的模式分解:

~      # 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
Run Code Online (Sandbox Code Playgroud)

请采取通知时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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

â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
Run Code Online (Sandbox Code Playgroud)

如果有人需要区分大写字母、小写字母和非字母,请参阅此帖子


它可能将这个问题的范围扩展得太远,但是如果您的输入字符特别松散(它们可能不存在于Lu可以处理的类别中),您可能需要检查第一个字符是否有大小写变体:

\p{L&} 或 \p{Cased_Letter}:存在大小写变体的字母(Ll、Lu 和 Lt 的组合)。

要包含带有SMALL变体的罗马数字(“数字字母”),如有必要,您可以将该额外范围添加到模式中。

https://www.fileformat.info/info/unicode/category/Nl/list.htm

代码:(演示

echo preg_match('~^[\p{Lu}\x{2160}-\x{216F}]~u', $test) ? 'upper' : 'not upper';
Run Code Online (Sandbox Code Playgroud)


Vid*_*nes 11

试过?

$str = 'the text to test';
if($str{0} === strtoupper($str{0})) {
   echo 'yepp, its uppercase';
}
else{
   echo 'nope, its not upper case';
}
Run Code Online (Sandbox Code Playgroud)


Rin*_*g Ø 5

请注意,PHP提供了ctype类似ctype_upper的系列。

您必须先通过setLocale()正确设置语言环境,才能使其与UTF-8一起使用。
例如,请参见有关ctype_alpha的注释。

用法:

if ( ctype_upper( $str[0] )) {
    // deal with 1st char of $str is uppercase
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我不希望数字和其他人成为上角字符,所以我使用:

if(preg_match('/[A-Z]$/',$char)==true)
{
   // this must be an upper char
   echo $char
}
Run Code Online (Sandbox Code Playgroud)


Har*_*rev 5

用于Kohana 2自动加载器功能:

echo $char < 'a' ? 'uppercase' : 'lowercase';
Run Code Online (Sandbox Code Playgroud)

当字符串字符转换为整数时,它将计算为其ASCII编号.正如您在ASCII表中所知,首先有一些控制字符和其他字符.然后是拉丁字母表中的大写字母.然后是拉丁字母表中的小写字母.因此,您可以轻松检查字母的代码是小于还是大于小拉丁字符a.

顺便说一句,这大约是具有正则表达式的解决方案的两倍.