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