Hoe controleer je of de letter hoger of lager is in PHP?

Ik heb teksten in UTF-8 met diakritische tekens, en ik wil graag controleren of de eerste letter van deze tekst een hoofdletter of kleine letter is. Hoe doe je dit?


Antwoord 1, autoriteit 100%

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

Merk op dat mb_substr nodig is om het eerste teken correct te isoleren.

Werkdemo online


Antwoord 2, autoriteit 54%

Gebruik ctype_upperom hoofdletters te controleren:

$a = array("Word", "word", "wOrd");
foreach($a as $w)
{
    if(ctype_upper($w{0}))
    {
        print $w;
    }
}

Antwoord 3, autoriteit 28%

Ik ben van mening dat een preg_-oproep de meest directe, beknopte en betrouwbare oproep is in vergelijking met de andere oplossingen die hier worden gepost.

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

Mijn patroonoverzicht:

~      # 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

Let op wanneer ctype_en < 'a'faalt met deze reeks tests.

Code: (Demo)

$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';
}

Uitvoer:

â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

Als iemand onderscheid moet maken tussen hoofdletters, kleine letters en niet-letters, bekijk dan dit bericht.


Misschien gaat het bereik van deze vraag te ver, maar als uw invoertekens bijzonder squirrelly zijn (ze bestaan ​​mogelijk niet in een categorie die Luaankan), wilt u misschien controleren of het eerste teken heeft hoofdlettervarianten:

\p{L&} of \p{Cased_Letter}: een letter die bestaat in kleine letters en hoofdletters (combinatie van Ll, Lu en Lt).

Als u Romeinse cijfers (“Cijferletters”) met varianten van SMALLwilt opnemen, kunt u indien nodig dat extra bereik aan het patroon toevoegen.

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

Code: (Demo)

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

Antwoord 4, autoriteit 20%

Geprobeerd?

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

Antwoord 5, autoriteit 10%

Zoals gebruikt in de Kohana 2 autoloader-functie:

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

Als een tekenreeks naar een geheel getal wordt gegoten, wordt het geëvalueerd tot zijn ASCII-nummer. Zoals u in de ASCII-tabel weet, zijn er eerst enkele besturingstekens en andere. Dan de hoofdletters uit het Latijnse alfabet. En dan de kleine letters uit het Latijnse alfabet. Zo kun je eenvoudig controleren of de code van een letter kleiner of groter is dan het kleine Latijnse teken a.

Dit is trouwens ongeveer twee keer zo snel als een oplossing met reguliere expressies.


Antwoord 6, autoriteit 10%

Houd er rekening mee dat PHP de ctype-familie biedt, zoals ctype_upper.

Je moet eerst de landinstelling correct instellen via setLocale()om het om met UTF-8 te werken.
Zie bijvoorbeeld de opmerking op ctype_alpha.

Gebruik:

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

Antwoord 7, autoriteit 8%

Ik wilde niet dat getallen en anderen een bovenste teken waren, dus gebruik ik:

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

Antwoord 8, autoriteit 4%

En alleen:

if (ucfirst($string) == $string) {dosomething();}

Antwoord 9, autoriteit 4%

Als je het in een leuke functie wilt, heb ik dit gebruikt:

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

Bel dan gewoon..

if (_is_upper($mystring))
{
  // Do....
}

Antwoord 10

if(ctype_upper(&value)){
    echo 'uppercase';
}
else {
    echo 'not upper case';
}

Other episodes