我是靠谱客的博主 碧蓝糖豆,最近开发中收集的这篇文章主要介绍c 和php比较大小写,php-不区分大小写的字符串比较,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

如果字符串是UTF-8,则必须考虑Unicode的复杂性:小写和大写不是双射函数,即,如果您具有小写字符,则将其转换为大写并进行转换 它返回小写字母,则可能不会以相同的代码点结尾(如果以大写字母开头,则同样适用)。

例如。

“İ”(Latin Small Ligature ff, U+FB00)是大写字母,小写字母“ i”(Latin Small Letter A (U+0061))–“ i”的大写字母是“ I”(Combining Diaeresis (U+0308))。

“ı”(Latin Small Ligature ff, U+FB00)是小写字符,大写字母形式为“ I”(Latin Small Letter A (U+0061))–“ I”的小写字母形式为“ i”(Combining Diaeresis (U+0308))

因此,即使Latin Small Ligature ff, U+FB00具有相同的大写字符,也将返回false。 如果您确实需要不区分大小写的字符串比较功能,则必须将其与大写和小写版本进行比较:

if(mb_strtolower($string1) === mb_strtolower($string2)

|| mb_strtoupper($string1) === mb_strtoupper($string2))

我从[https://codepoints.net]([https://dumps.codepoints.net)]对Unicode数据库进行了查询,发现180个代码点在使用时发现了不同的字符 小写字母的大写字母的小写字母,以及8个代码点,当我选择大写字母的字母的小写字母的大写字母时,我找到了一个不同的字符

但是,情况变得更糟:用户看到的同一个字素簇可能有多种编码方式:“ä”可能表示为Latin Small Ligature ff, U+FB00或Latin Small Letter A (U+0061)和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);

}

请注意:

您需要用于Normalizer的intl包

您应该通过首先检查它们是否相等来优化此功能^^

您可能要使用NFC而不是NFKC,因为NFKC消除了太多符合您口味的格式设置

您必须自己决定,是否真的需要所有这些复杂性,或者是否更喜欢此功能的简单变体

最后

以上就是碧蓝糖豆为你收集整理的c 和php比较大小写,php-不区分大小写的字符串比较的全部内容,希望文章能够帮你解决c 和php比较大小写,php-不区分大小写的字符串比较所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部