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

Posted

技术标签:

【中文标题】如何完全替换 PHP 中的所有特殊字符而不在结果中留下任何 HTML 实体【英文标题】:How to fully replace all special characters in PHP without leaving any HTML Entity in the result 【发布时间】:2015-09-04 12:08:45 【问题描述】:

我在尝试创建的 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

我希望能够用我的函数替换 Â? 部分。 如何实现?

【问题讨论】:

【参考方案1】:

我找到了这个函数(在这个线程中:How to remove accents and turn letters into "plain" ASCII characters?):

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

【讨论】:

好吧,就我而言,它打印A?balos。任何想法为什么? 在您的 php.ini 文件中验证 default_charset 设置为 UTF-8 像这样 default_charset = "utf-8"【参考方案2】:

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

<?php

    setlocale(LC_ALL, 'en_US.UTF-8');

    $str = "Ábalos";

    echo iconv('UTF-8', 'ASCII//TRANSLIT', $str);

?>

【讨论】:

我试过了,但它给我留下了A balos。而且我不能替换空间,因为它可以是一个实际的空间。 @user3132858 很奇怪,我运行它时没有看到空格。 不知道我做了什么(因为我现在纠结了 10 个小时)但现在它显示 A?balos。现在可能是什么问题?

以上是关于如何完全替换 PHP 中的所有特殊字符而不在结果中留下任何 HTML 实体的主要内容,如果未能解决你的问题,请参考以下文章

如何替换字符串中的所有特殊字符

如何删除/替换字符串列中的一系列特殊字符? [关闭]

如何使用特定符号 C++ 查找和替换字符串中的所有字符

如何仅替换不在 c# 中的两个引号之间的字符串

如何替换字符串中的特殊字符?

我想从文件名中删除特殊字符而不影响 c# 中的扩展名