我想比较两个变量是否相同,但是我希望这种比较不区分大小写。
例如,这将区分大小写:
if($var1 == $var2){
...
}
但是我希望这不区分大小写,我将如何处理呢?
我想比较两个变量是否相同,但是我希望这种比较不区分大小写。
例如,这将区分大小写:
if($var1 == $var2){
...
}
但是我希望这不区分大小写,我将如何处理呢?
Answers:
这很简单;您只需要调用strtolower()
两个变量。
如果您需要处理Unicode或国际字符集,则可以使用mb_strtolower()
。
请注意,其他答案建议使用strcasecmp()
-该函数不能处理多字节字符,因此任何UTF-8字符串的结果都是虚假的。
mb_strtolower()
改用。
strcasecmp()
如果字符串相同(除了大小写不同),则返回0,因此可以使用:
if (strcasecmp($var1, $var2) == 0) {
}
strcasecmp()
不处理多字节字符,因此无法应付Unicode。
如果您的字符串采用单字节编码,则很简单:
if(strtolower($var1) === strtolower($var2))
如果字符串是UTF-8,则必须考虑Unicode的复杂性:小写和大写不是双射函数,即,如果您具有小写字符,则将其转换为大写并进行转换回到小写,您可能不会以相同的代码点结尾(如果以大写字母开头,则同样适用)。
例如
Latin Capital Letter I with Dot Above, U+0130
)是大写字符,小写字母“ i”(Latin Small Letter I, U+0069
)–“ i”的大写字母是“ I”(Latin Capital Letter I, U+0049
)。Latin Small Letter Dotless I, U+0131
)是小写字符,以“ I”(Latin Capital Letter I, U+0049
)为大写字母,而“ I”的小写字母为“ i”(Latin Small Letter I, U+0069
)因此mb_strtolower('ı') === mb_strtolower('i')
,即使它们具有相同的大写字符,也将返回false。如果您确实需要不区分大小写的字符串比较功能,则必须比较大写和小写版本:
if(mb_strtolower($string1) === mb_strtolower($string2)
|| mb_strtoupper($string1) === mb_strtoupper($string2))
我已经从https://codepoints.net(https://dumps.codepoints.net)对Unicode数据库进行了查询,我发现180个代码点在使用小写字符时发现了另一个字符大写字母的小写字母,以及8个代码点,当我将大写字母的字母的小写字母的大写字母转换为8个代码点时
但是,情况变得更糟:用户看到的同一个字素簇可能有多种编码方式:“ä”可能用asLatin Small Letter a with Diaeresis (U+00E4)
或asLatin Small Letter A (U+0061)
和as表示Combining Diaeresis (U+0308)
–如果以字节级别比较它们,则不会返回true!
但是在Unicode中有一个解决方案:规范化!有四种不同的形式:NFC,NFD,NFKC,NFKD。对于字符串比较,NFC和NFD是等效的,而NFKC和NFKD是等效的。我选择NFKC,因为它比NFKD短,并且“ ff”(Latin Small Ligature ff, U+FB00
)将转换为两个普通的“ f”(但是2⁵也将扩展为25…)。
结果函数变为:
function mb_is_string_equal_ci($string1, $string2) {
$string1_normalized = Normalizer::normalize($string1, Normalizer::FORM_KC);
$string2_normalized = Normalizer::normalize($string2, Normalizer::FORM_KC);
return mb_strtolower($string1_normalized) === mb_strtolower($string2_normalized)
|| mb_strtoupper($string1_normalized) === mb_strtoupper($string2_normalized);
}
请注意:
if(strtolower($var1) == strtolower($var2)){
}
'A' = 'a'
是真的。参考:dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html