试图从php中的字符串中删除重音符号


Trying to remove accents from string in php

我试图从字符串中删除重音符号,并在php中编写了以下函数,但没有删除它们。字符串进入时带有重音,返回时带有重音。

function stripaccents($string)
{
    $replace = array('é','í','ó','á','ñ', 'ú', 'ü');
    $with = array('e','i','o','a', 'n', 'u', 'u');
    foreach ($replace as &$char)
    {
        $char = utf8_decode($char);
    }
    unset($char);
    $newstring = str_replace($replace, $with, $string);
    return $newstring;
}

如果您使用的是PHP 5.3或更高版本(您应该使用),请使用内置函数:

$newstring = normalizer_normalize($oldstring);

您也可以使用iconv

$newstring = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

由于您要在specific中查找西班牙语字符,因此可以使用正则表达式来查找这些特定字符:

function stripaccents($string)
{
    $replace = array('/é/','/í/','/ó/','/á/','/ñ/', '/ú/', '/ü/');
    $with = array('e','i','o','a', 'n', 'u', 'u');
    $newstring = preg_replace($replace, $with, $string);
    return $newstring;
}

否则,您可以使用前面提到的其他函数之一。

我认为您不需要

foreach ($replace as &$char)
    {
        $char = utf8_decode($char);
    }
    unset($char);

因为utf8_decode试图将2字节值从$replace转换为1字节值

这是我正在使用的一个自定义。

function remove_accents($str, $charset = 'utf-8') {
    $str = htmlentities($str, ENT_NOQUOTES, $charset);
    $str = preg_replace('#&([A-za-z])(?:acute|cedil|caron|circ|grave|orn|ring|slash|th|tilde|uml);#', ''1', $str);
    $str = preg_replace('#&([A-za-z]{2})(?:lig);#', ''1', $str);
    $str = preg_replace('#&[^;]+;#', '', $str);
    return $str;
}

我在PHP中找到的最好的方法,你当然可以自定义它:

$transliterator = Transliterator::createFromRules(':: Any-Latin; :: Latin-ASCII; :: NFD; :: [:Nonspacing Mark:] Remove; :: Upper(); :: NFC;', Transliterator::FORWARD);
return $transliterator->transliterate('çÇ æ λώπηξ-É&-è_çà=@146/,*');
Output: "CC AE LOPEX-E&-E_CA=@146/,*"

来源:https://www.php.net/manual/en/class.transliterator.php