不区分大小写的字符串比较

时间:2011-03-29 13:45:31

标签: php if-statement case-insensitive

我想比较两个变量,看它们是否相同,但我希望这个比较不区分大小写。

例如,这将区分大小写:

if($var1 == $var2){
   ...
}

但我希望这个不区分大小写,我该如何处理呢?

6 个答案:

答案 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.nethttps://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

请注意:

  • 您需要intl
  • Normalizer
  • 你应该首先检查它们是否相等^^
  • 来优化这个功能
  • 您可能想要使用NFC而不是NFKC,因为NFKC会根据您的口味删除太多的格式区别
  • 你必须自己决定,如果你真的需要所有这些复杂性,或者你更喜欢这个功能的更简单的变体

答案 3 :(得分:1)

if(strtolower($var1) == strtolower($var2)){
}

答案 4 :(得分:0)

使用strcasecmp

答案 5 :(得分:-1)

为什么不:

if(strtolower($var1) == strtolower($var2)){
}