, çok basit:-to küçük harf ve-üst:
if(strtolower($var1) === strtolower($var2))
dize UTF-8 ise, Unicode karmaşıklığını dikkate almak zorunda -case işlevi, eğer küçük harf karakteriniz varsa, büyük harfe dönüştürür ve küçük harfe dönüştürürseniz, aynı kod noktasıyla sonlanamazsınız (ve aynı şey, eğer başlarsanız doğrudur) büyük harfli bir karakter).
E.g. ve "i" 'in üst durum varyantı (Latin Capital Letter I, U+0049
) "I" olduğu -
- "İ" (
Latin Capital Letter I with Dot Above, U+0130
) "i" (Latin Small Letter I, U+0069
), alt durum varyantı olarak sahip, bir büyük harf karakter.
- daha düşük bir harf karakter üst durumda varyant olarak "I" (
Latin Capital Letter I, U+0049
) ile, bir (Latin Small Letter Dotless I, U+0131
) "ı" - ve "I" 'in alt durum değişkeni "i" (Latin Small Letter I, U+0069
)
olduğu Yani aynı büyük harf karakterine sahip olsalar bile mb_strtolower('ı') === mb_strtolower('i')
yanlış döndürür.Eğer gerçekten bir harf duyarsız dize karşılaştırma işlevi isterseniz, büyük harf VE küçük harf sürümüne karşılaştırmak zorunda: Ben https://codepoints.net (https://dumps.codepoints.net) den Unicode veritabanında bir sorgu çalıştırmak ettik
if(mb_strtolower($string1) === mb_strtolower($string2)
|| mb_strtoupper($string1) === mb_strtoupper($string2))
ve ben ve bir küçük harf karakterinin büyük harfinin küçük harfini alırken farklı bir karakter bulduğum 180 kod noktasını ve bir büyük harfin küçük harfinin büyük harfini alırken farklı bir karakter bulduğum 8 kod noktasını buldu
Ama kötüye gider: kullanıcı tarafından görülen aynı grafik kümesi, onu kodlamanın birden fazla yoluna sahip olabilir: "ä "Latin Small Letter a with Diaeresis (U+00E4)
veya Latin Small Letter A (U+0061)
ve Combining Diaeresis (U+0308)
olarak temsil edilebilir - ve bunları bayt düzeyinde karşılaştırırsanız, bu geri dönüş olmaz!
Ancak Unicode'da bunun için bir çözüm var: Normalization! Dört farklı form vardır: NFC, NFD, NFKC, NFKD. Dizi karşılaştırması için NFC ve NFD eşdeğerdir ve NFKC ve NFKD eşdeğerdir. NFKC'yi NFKD'den daha kısa olduğu için alacağım ve "ff" (Latin Small Ligature ff, U+FB00
) iki normal "f" ye dönüştürülecektir (ancak 2⁵ ayrıca 25… 'e genişletilecektir).
çıkan fonksiyon haline gelir:
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);
}
unutmayın:
- Eğer onlar sadece eşit lütfen önce kontrol ederek bu fonksiyonu optimize etmelidir Normalizer
- için intl paket lazım NFKC, NFKC yerine NFC kullanmak isteyebileceğinden, NFKC, çok fazla biçimlendirme ayrımını kaldırdığı için NFC'yi NFC yerine kullanmak isteyebilirsiniz:
- r zevkinize
- Gerçekten bütün bu karmaşıklığı gerekirse, kendiniz için karar vermek zorunda veya bu fonksiyonun daha basit bir varyantını tercih ediyorsanız durum olamaz EĞER çalışmasından dolayı
kesinlikle hassas (in), konuşma yalnızca boolean değerleri. Karşılaştırma operatörü demek istedin, '==' bir. –