Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以比较西班牙语中的两个字符串,而不考虑PHP中的重音?_Php_String_Comparison_Compare_String Comparison - Fatal编程技术网

有没有一种方法可以比较西班牙语中的两个字符串,而不考虑PHP中的重音?

有没有一种方法可以比较西班牙语中的两个字符串,而不考虑PHP中的重音?,php,string,comparison,compare,string-comparison,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 str

我的问题是,如果我有以下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>';
   }
$cadena1='JUAN LÓPEZ YÁñEZ';
$cadena2='JUAN LOPEZ YÁñEZ';
如果($cadena1==$cadena2){
echo“

字符串匹配!

”; }否则{ echo“

字符串不匹配。区分重音?

”; }
例如,我注意到,如果我比较洛佩兹和拉佩兹,那么比较结果就会变成错误


有没有一种方法或函数可以在不考虑西班牙语重音的情况下比较这些字符串?

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

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

您可以尝试该函数,至少在您的示例中是有效的:

var_dump(soundex('LOPEZ'));
// string(4) "L120"

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


请参阅。

这两个字符串比较为false,因为它们实际上是不同的字节序列。要比较它们,您需要以任何方式对它们进行规范化

最好的方法是使用音译类,这是PHP5.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";
}
?>
(摘自我的回答:)

这将根据ICU库的表格替换字符,这些表格非常完整且经过良好测试。在进行音译之前,这会规范化字符串,因此它会匹配任何可能的表示字符的方式,如ñ(例如,可以用1个多字节字符或两个字符的组合表示ñ和n)


与使用soundex()不同,soundex()也非常占用资源,它不比较声音,因此更准确。

为什么不使用来自intl extension、Collator类的排序规则

  • 主要级别忽略重音和大小写
  • 使用主级别,并将Collator::CASE_-level属性设置为On,以忽略重音,但不忽略大小写
(等等-有关详细信息,请参阅ICU或PHP文档)

(当然,字符串必须是UTF-8编码的)

从中尝试此函数。它将用字符串中的ASCII字符替换非ASCII字符

$cadena1='JUAN LÓPEZ YÁÑEZ';
$cadena2='JUAN LOPEZ YÁÑEZ';

function slugify( $text ) {

    // replace non letter or digits by -
    $text = preg_replace('~[^\\pL\d]+~u', '-', $text);  
    $text = trim($text, '-');

    /**
     * //IGNORE//TRANSLIT to avoid errors on non translatable characters and still translate other characters
     * //TRANSLIT to out_charset transliteration is activated
     * //IGNORE, characters that cannot be represented in the target charset are silently discarded
    */
    $text = iconv('utf-8', 'ASCII//IGNORE//TRANSLIT', $text);
    $text = strtolower(trim($text));

    // remove unwanted characters
    $text = preg_replace('~[^-\w]+~', '', $text);

    return empty($text) ? '' : $text;
}

var_dump( slugify( $cadena1 ) );    // string(16) "juan-lopez-yanez"
var_dump( slugify( $cadena2 ) );    // string(16) "juan-lopez-yanez"

你打算对Unicode表中的所有60000个字符都这样做吗?不,只针对西班牙语/法语中的7个重音。如果你愿意,可以找到一个预先存在的dict。你不是在剥离一个角色,而是在用另一个角色替换它。所以,您需要构建一个字符的dict,以及它们的替换值。那么多个表示呢?ñ可以用两种不同的方式表示,例如,用两个不同的字节序列。@fallereneaper检查我的答案这可能会有帮助,但很难看。他们实际上是不同的角色。您可能想构建一个dict,将替换函数中的字符a指向字符B。这里可能已经回答了。。。[[1]:您可能想要签出,并且可能会对不属于ASCII表的字符产生意外行为(即使没有变音符号也不例外)。例如,想想亚洲字符。这就是重点,不是吗?1)问题是语言特定的。2)如果您想了解一般情况,请随意使用“根”区域设置(UCA)正如PHP5.4.18和5.5.1以来grapheme_stri*函数所做的那样。对我来说,它是a+1,这应该是公认的答案。
$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
$cadena1='JUAN LÓPEZ YÁÑEZ';
$cadena2='JUAN LOPEZ YÁÑEZ';

function slugify( $text ) {

    // replace non letter or digits by -
    $text = preg_replace('~[^\\pL\d]+~u', '-', $text);  
    $text = trim($text, '-');

    /**
     * //IGNORE//TRANSLIT to avoid errors on non translatable characters and still translate other characters
     * //TRANSLIT to out_charset transliteration is activated
     * //IGNORE, characters that cannot be represented in the target charset are silently discarded
    */
    $text = iconv('utf-8', 'ASCII//IGNORE//TRANSLIT', $text);
    $text = strtolower(trim($text));

    // remove unwanted characters
    $text = preg_replace('~[^-\w]+~', '', $text);

    return empty($text) ? '' : $text;
}

var_dump( slugify( $cadena1 ) );    // string(16) "juan-lopez-yanez"
var_dump( slugify( $cadena2 ) );    // string(16) "juan-lopez-yanez"