如何在不留下任何 HTML 实体的情况下完全替换 PHP 中的所有特殊字符


How to fully replace all special characters in PHP without leaving any HTML Entity in the result

我需要有关我正在尝试创建的PHP替换函数的帮助。

基本上,我想将所有特殊字符(如á, é, í, ó, ú, ü, ñ, Á, É, Í, Ó, Ú, Ü, Ñ等)转换为:a, e, i, o, u, u, n, A, E, I, O, U, U, N .下面解释了为什么我说"完全转换"。

现在我只设法使用以下函数完成了一半:

function clean_url($text){
         $text = preg_replace('~&([a-z]{1,10})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($text, ENT_QUOTES, 'UTF-8'));
    return $text;
}

乍一看,这给了我在 MySQL 或浏览器中查看时想要的结果,所以在 PHP 中:

$string = "Ábalos";
echo clean_url($string);

HTML 页面源代码输出:Abalos .乍一看,这看起来很合适。

但是当我这样做时

$string = "Ábalos";
echo htmlentities(clean_url(($string));

HTML 页面源代码输出:AÂ?balos .

我希望能够用我的函数替换那部分Â?.如何实现这一点?

我发现了这个函数(在这个线程中:如何删除重音并将字母转换为"纯"ASCII 字符?

function toASCII( $str )
{
    return strtr(utf8_decode($str), 
        utf8_decode(
        'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
        'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}

我测试了一些字符串,它可以工作。例如:

function toASCII( $str )
{
    return strtr(utf8_decode($str), 
        utf8_decode(
        'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
        'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
$string = "Ábalos";
echo toASCII($string);

将打印Abalos

您可以使用iconv来完成此操作。

<?php
    setlocale(LC_ALL, 'en_US.UTF-8');
    $str = "Ábalos";
    echo iconv('UTF-8', 'ASCII//TRANSLIT', $str);
?>