我的问题是,鉴于我有以下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>';
}
例如,如果我比较LOPEZ和LÓPEZ,则比较结果为false。
是否有一种方法或函数已经可以比较这些字符串,而与西班牙口音无关?
在比较它们之前,我会替换您字符串中的所有重音。您可以使用以下代码进行操作:
$replacements = array('Ó'=>'O', 'Á'=>'A', 'Ñ' => 'N'); //Add the remaining Spanish accents.
$output = strtr("JUAN LÓPEZ YÁÑEZ",$replacements);
[output
现在将等于cadena2
。
这两个字符串比较为false,因为它们实际上是不同的字节序列。要比较它们,您需要以任何方式对其进行标准化。
最佳方法是使用Transliterator类,该类是PHP 5.4+上intl
扩展的一部分。
测试代码:
<?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";
}
?>
结果:
abcd --> abcd
èe --> ee
€ --> €
àòùìéëü --> aouieeu
àòùìéëü --> aouieeu
tiësto --> tiesto
(摘自我的回答:mySQL - matching latin (english) form input to utf8 (non-English) data)
这将根据ICU库的表来替换字符,这些表非常完整且经过了充分测试。在音译之前,这会规范化字符串,因此它会匹配任何可能的方式来表示字符,例如ñ(例如,可以用1个多字节字符或用两个字符〜和n的组合来表示。)
与使用soundex()一样,它也非常占用资源,它不比较声音,因此更准确。
为什么不只使用国际扩展名Collator类的归类?
(依此类推-有关详细信息,请参阅ICU或PHP文档)
$cadena1 = 'JUAN LÓPEZ YÁÑEZ';
$cadena2 = 'JUAN LOPEZ YÁÑEZ';
$coll = new Collator('es_ES');
$coll->setStrength(Collator::PRIMARY);
//$coll->setAttribute(Collator::CASE_LEVEL, Collator::ON);
var_dump($coll->compare($cadena1, $cadena2)); // 0 = equals
(当然,字符串必须为UTF-8编码)
您可以尝试使用soundex()
函数,该函数至少对您的示例有效:
soundex()
您必须测试不同的单词,如果结果不够好,您可以尝试var_dump(soundex('LOPEZ'));
// string(4) "L120"
var_dump(soundex('LÓPEZ'));
// string(4) "L120"
。
尝试从similar_text()
开始使用此功能。它将用字符串中的ASCII字符替换非ASCII字符。
example with your code