尝试在php中删除字符串中的重音符号

t9aqgxwy  于 2023-02-21  发布在  PHP
关注(0)|答案(6)|浏览(168)

我试图从字符串中删除重音符号,并在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;
}
zpgglvta

zpgglvta1#

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

$newstring = normalizer_normalize($oldstring);
nkkqxpd9

nkkqxpd92#

您也可以使用iconv

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

4xy9mtcn3#

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

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

    $newstring = preg_replace($replace, $with, $string);

    return $newstring;
}

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

8gsdolmq

8gsdolmq4#

我觉得你不需要

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

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

ebdffaop

ebdffaop5#

这是我正在使用的一个习惯。

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;
}
6tdlim6h

6tdlim6h6#

这是我在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

相关问题