有没有一种方法可以比较西班牙语中的两个字符串,而与PHP中的重音符号无关?

问题描述 投票:3回答:5

我的问题是,鉴于我有以下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>';
   }

例如,如果我比较LOPEZLÓPEZ,则比较结果为false。

是否有一种方法或函数已经可以比较这些字符串,而与西班牙口音无关?

php string comparison compare string-comparison
5个回答
5
投票

在比较它们之前,我会替换您字符串中的所有重音。您可以使用以下代码进行操作:

$replacements = array('Ó'=>'O', 'Á'=>'A', 'Ñ' => 'N'); //Add the remaining Spanish accents. 
$output = strtr("JUAN LÓPEZ YÁÑEZ",$replacements);

[output现在将等于cadena2


3
投票

这两个字符串比较为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()一样,它也非常占用资源,它不比较声音,因此更准确。


1
投票

为什么不只使用国际扩展名Collat​​or类的归类?

  • 具有忽略重音的主要级别情况
  • 使用主级别并将Collat​​or :: CASE_LEVEL属性设置为On可以忽略重音,但不能忽略大小写

(依此类推-有关详细信息,请参阅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编码)


0
投票

您可以尝试使用soundex()函数,该函数至少对您的示例有效:

soundex()

您必须测试不同的单词,如果结果不够好,您可以尝试var_dump(soundex('LOPEZ')); // string(4) "L120" var_dump(soundex('LÓPEZ')); // string(4) "L120"

参见similar_text()


0
投票

尝试从similar_text()开始使用此功能。它将用字符串中的ASCII字符替换非ASCII字符。

example with your code
© www.soinside.com 2019 - 2024. All rights reserved.