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

Php 不区分大小写的字符串比较,php,if-statement,case-insensitive,Php,If Statement,Case Insensitive,我想比较两个变量,看看它们是否相同,但我希望这个比较不区分大小写 例如,这将区分大小写: if($var1 == $var2){ ... } 但我希望它不区分大小写,我该如何处理它?这相当简单;您只需要调用这两个变量 如果需要处理Unicode或国际字符集,可以使用 请注意,其他答案建议使用-该函数不处理多字节字符,因此任何UTF-8字符串的结果都是假的。为什么不: if(strtolower($var1) == strtolower($var2)){ } if(strtolower(

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

例如,这将区分大小写:

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

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

这相当简单;您只需要调用这两个变量

如果需要处理Unicode或国际字符集,可以使用

请注意,其他答案建议使用-该函数不处理多字节字符,因此任何UTF-8字符串的结果都是假的。

为什么不:

if(strtolower($var1) == strtolower($var2)){
}
if(strtolower($var1) == strtolower($var2)){
}
如果字符串相同(除大小写变化外),则返回0,以便您可以使用:

if (strcasecmp($var1, $var2) == 0) {
}

使用。

如果字符串采用单字节编码,则很简单:

if(strtolower($var1) === strtolower($var2))
如果你的字符串是UTF-8,你必须考虑Unicode的复杂性:小写和大写都不是双射函数,也就是说,如果你有一个小写字符,把它转换成大写字母,然后把它转换成小写,你可能不会得到相同的代码点。(如果以大写字符开头,同样适用)

例如

  • “İ”(
    带点的拉丁文大写字母I,U+0130
    )是一个大写字符,以“I”(
    拉丁文小写字母I,U+0069
    )作为其小写变体,“I”的大写变体是“I”(
    拉丁文大写字母I,U+0049
  • “ı”(
    拉丁文小写字母Dotless I,U+0131
    )是一个小写字符,大写字母为“I”(
    拉丁文大写字母I,U+0049
    ),小写字母为“I”(
    拉丁文小写字母I,U+0069
因此,
mb_strtolower('ı')==mb_strtolower('i')
返回false,即使它们具有相同的大写字符。如果确实需要不区分大小写的字符串比较函数,则必须与大写和小写版本进行比较:

if(mb_strtolower($string1) === mb_strtolower($string2)
  || mb_strtoupper($string1) === mb_strtoupper($string2))
我在()中对Unicode数据库运行了一个查询,找到了180个代码点,在使用小写字符的大写字母的小写字母时,找到了不同的字符;在使用大写字符的小写字母的大写字母时,找到了8个代码点,找到了不同的字符

但情况更糟:用户看到的同一个字组可能有多种编码方式:“ä”可以表示为
带分音符的拉丁文小写字母a(U+00E4)
带分音符的拉丁文小写字母a(U+0061)
组合分音符(U+0308)
–如果在字节级别对它们进行比较,则不会返回true

但在Unicode中有一个解决方案:!有四种不同的形式:NFC、NFD、NFKC、NFKD。对于字符串比较,NFC和NFD是等价的,NFKC和NFKD是等价的。我认为NFKC比NFKD短,所以“fff”(
拉丁小连字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);
}
请注意:

  • 你需要这个包裹
  • 您应该通过首先检查它们是否相等来优化此函数^^
  • 您可能希望使用NFC而不是NFKC,因为NFKC消除了太多的格式差异
  • 您必须自己决定,您是否真的需要所有这些复杂性,或者您是否更喜欢此函数的更简单变体

一般来说,我认为MySQL字符串比较不区分大小写。也就是说,
'A'='A'
是正确的。参考:对不起,我不是MySQL方面的专家;您可能想将其作为一个单独的问题发布。请注意,使用此方法可能会遇到字符集问题(例如,如果您使用一些奇怪的UTF-8字符)在这种情况下,请改用
mb_strtolower()
。不幸的是,这并不是那么简单:在Unicode中,小写变量的大写字符可能与您开始时的不一样,反之亦然。也就是说,您必须与mb_strtolower()和mb_strtoupper()进行比较@robotik我不能编辑评论,但你可以从我的答案中复制,这是正确的;)记住测试==0;这是违反直觉的,因为编写“if(strcasecmp($var1,$var2)){…”很有诱惑力,但在本例中,0表示相等,而不是通常情况下的假notequal。
strcasecmp()
不处理多字节字符,因此无法处理Unicode。正如其他答案所指出的,Unicode是不适用的。虽然我理解这项技术,而且它相当基本,但这不是一个慷慨的或解释性的答案。当新研究人员看到只使用旧代码的答案时,他们会开始认为这是完全可以接受的回答关于Stackoverflow的问题。请以更好的发帖行为为榜样,进行教育,而不是放弃一个解决方案,一走了之。