我想比较两个变量,看它们是否相同,但我希望这个比较不区分大小写。
例如,这将区分大小写:
if($var1 == $var2){
...
}
但我希望这个不区分大小写,我该如何处理呢?
答案 0 :(得分:99)
这很简单;你只需要在两个变量上调用strtolower()
。
如果您需要处理Unicode或国际字符集,可以使用mb_strtolower()
。
请注意,其他答案建议使用strcasecmp()
- 该函数不处理多字节字符,因此任何UTF-8字符串的结果都将是假的。
答案 1 :(得分:64)
strcasecmp()
返回0(除了大小写变化),因此您可以使用:
if (strcasecmp($var1, $var2) == 0) {
}
答案 2 :(得分:14)
如果你的字符串是单字节编码,那很简单:
if(strtolower($var1) === strtolower($var2))
如果你的字符串是UTF-8,你必须考虑Unicode的复杂性:to-lower-case和to-upper-case不是双射函数,即如果你有一个小写字符,把它转换成大写字母,并将其转换回小写,你可能不会得到相同的代码点(如果你以大写字母开头也是如此)。
E.g。
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个代码点,当我采用小写字符的大写字母时,我发现了一个不同的字符case和8个代码点,当我用大写字符的小写字母大写时,我发现了一个不同的字符
但它变得更糟:用户看到的相同字形集群可能有多种编码方式:“ä”可能表示为Latin Small Letter a with Diaeresis (U+00E4)
或{{1} }和Latin Small Letter A (U+0061)
- 如果你在字节级别比较它们,这将不会返回true!
但是在Unicode中有一个解决方案:Normalization!有四种不同的形式:NFC,NFD,NFKC,NFKD。对于字符串比较,NFC和NFD是等效的,NFKC和NFKD是等效的。我会选择NFKC,因为它比NFKD短,而且“ff”(Combining Diaeresis (U+0308)
)将转换为两个正常的“f”(但是2⁵也会扩展到25 ......)。
结果函数变为:
Latin Small Ligature ff, U+FB00
请注意:
答案 3 :(得分:1)
if(strtolower($var1) == strtolower($var2)){
}
答案 4 :(得分:0)
使用strcasecmp。
答案 5 :(得分:-1)
为什么不:
if(strtolower($var1) == strtolower($var2)){
}