如何完全替换 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 实体的主要内容,如果未能解决你的问题,请参考以下文章