Pat*_*ros 3 php string comparison compare string-comparison
我的问题是,鉴于我有以下 php 代码来比较两个字符串:
$cadena1='JUAN LÓPEZ YÁÑEZ';
$cadena2='JUAN LOPEZ YÁÑEZ';
if($cadena1===$cadena2){
echo '<p style="color: green;">The strings match!</p>';
}else{
echo '<p style="color: red;">The strings do not match. Accent sensitive?</p>';
}
Run Code Online (Sandbox Code Playgroud)
我注意到,例如,如果我比较LOPEZ和LÓPEZ,则比较结果为假。
无论西班牙口音如何,是否有一种方法或功能可以比较这些字符串?
这两个字符串比较为 false,因为它们实际上是不同的字节序列。要比较它们,您需要以任何方式将它们标准化。
最好的方法是使用 Transliterator 类,它是intl
PHP 5.4+ 扩展的一部分。
一个测试代码:
<?php
$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
$test = ['abcd', 'èe', '€', 'àòùìéëü', 'àòùìéëü', 'tiësto'];
foreach($test as $e) {
$normalized = $transliterator->transliterate($e);
echo $e. ' --> '.$normalized."\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
结果:
abcd --> abcd
èe --> ee
€ --> €
àòùìéëü --> aouieeu
àòùìéëü --> aouieeu
tiësto --> tiesto
Run Code Online (Sandbox Code Playgroud)
(取自我在这里的回答:mySQL - 匹配拉丁语(英语)表单输入到 utf8(非英语)数据)
这将根据 ICU 库的表替换字符,这些表非常完整且经过良好测试。在音译之前,这会标准化字符串,因此它匹配任何可能的表示字符的方式,例如 ñ(例如,ñ 可以用 1 个多字节字符或两个字符 ˜ 和 n 的组合来表示)。
与使用 soundex() 不同,这也是非常资源密集型的,这不会比较声音,因此更准确。