在 php 中测试给定字符的大写或小写类型的最佳方法是什么?

问题描述 投票:0回答:1

无论当前本地语言如何,检测字符是大写还是小写的理想方法是什么。

有没有更直接的功能?

假设:将内部字符编码设置为 UTF-8 并且本地浏览器会话是 en-US,en;q=0.5 并且已安装多字节字符串扩展。不要使用 ctype_lower 或 ctype_upper。

请参阅下面的测试代码,该代码应该是多字节兼容的。

$encodingtype = 'utf8';
$charactervalue = mb_ord($character, $encodingtype);

$characterlowercase = mb_strtolower($character, $encodingtype) ;
$characterlowercasevalue = mb_ord(mb_strtolower($character, $encodingtype));

$characteruppercase = mb_strtoupper($character, $encodingtype);
$characteruppercasevalue = mb_ord(mb_strtoupper($character, $encodingtype));



// Diag Info
echo 'Input: ' . $character . "<br />";
echo 'Input Value: ' . $charactervalue = mb_ord($character, $encodingtype) . "<br />" . "<br />";
echo 'Lowercase: ' . $characterlowercase = mb_strtolower($character, $encodingtype) . "<br />";
echo 'Lowercase Value: ' . $characterlowercasevalue = mb_ord(mb_strtolower($character, $encodingtype)) . "<br />" . "<br />";
echo 'Uppercase: ' . $characteruppercase = mb_strtoupper($character, $encodingtype) . "<br />";
echo 'Uppercase Value: ' . $characteruppercasevalue = mb_ord(mb_strtoupper($character, $encodingtype)) . "<br />" . "<br />";
// Diag Info


if ($charactervalue == $characterlowercasevalue and $charactervalue != $characteruppercasevalue){
    $uppercase = 0;
    $lowercase = 1;
    echo 'Is character is lowercase' . "<br />" . "<br />";
}

elseif ($charactervalue == $characteruppercasevalue and $charactervalue != $characterlowercasevalue ){
    $uppercase = 1;
    $lowercase = 0;
    echo 'Character is uppercase' . "<br />" . "<br />";
}

else{
    $uppercase = 0;
    $lowercase = 0;
    echo 'Character is neither lowercase or uppercase' . "<br />" . "<br />";
}
  • //测试1 A //输出->字符为大写
  • //测试2 z //输出->字符为小写
  • // 测试 3 + // 输出->字符为小写
  • //测试4 0 //输出->字符既不是小写也不是大写
  • // 测试 5 ǻ // 上面带有环的拉丁文小写字母 A 和 ACUTE // 输出 -> 字符为小写
  • // 测试 6 Ͱ GREEK CAPITAL LETTER HETA // 输出-> 字符为大写
  • //测试7 '' NULL //输出->字符既不是小写也不是大写
php regex multibyte
1个回答
1
投票

我觉得最直接的方法是编写一个带有交替的正则表达式模式来确定字符类型。

在下面的代码片段中,我将在第一个捕获组中搜索大写字母(包括 unicode),或者在第二个捕获组中搜索小写字母,或者空匹配。如果模式进行空匹配,则该字符不是字母,并且只有完整的字符串匹配元素才会填充到匹配数组中。

关于正则表达式中的 unicode 字母的一个很好的参考:https://regular-expressions.mobi/unicode.html

写入由管道分隔的两个捕获组意味着每种类型的字母将被插入到输出数组中的不同索引元素中。

[0]
是全字符串匹配,仅当它是数组中唯一的元素时才会使用。
[1]
将保存大写匹配(或者当存在小写匹配时为空——作为占位元素)。
[2]
将保存小写匹配——只有存在小写匹配时才会生成。

因此,我们可以假设 matches 数组中的最高键将决定字母的大小写。

如果输入字符是非字母,

preg_match()
将返回单元素数组,当发生这种情况时,
0
键与查找一起使用来访问
neither

代码:(演示

$lookup = ['neither', 'upper', 'lower'];
$tests = ['A', 'z', '+', '0', 'ǻ', 'Ͱ', ''];

foreach ($tests as $test) {
    preg_match('~(\p{Lu})|(\p{Ll})|~u', $test, $out);
    printf("%s, %s\n", $test, $lookup[array_key_last($out)]);
    //printf("%s: %s\n", $test, $lookup[count($out) - 1]); // below PHP7.3
}

输出:

A: upper
z: lower
+: neither
0: neither
ǻ: lower
Ͱ: upper
: neither

这个答案与这个类似的页面密切相关:How to check if letter is upper or lower in PHP?

© www.soinside.com 2019 - 2024. All rights reserved.