需要 php 编码特殊字符而不是 html 标签,以便包含在 wordpress 扩展 rss 文件中

Posted

技术标签:

【中文标题】需要 php 编码特殊字符而不是 html 标签,以便包含在 wordpress 扩展 rss 文件中【英文标题】:Need php to encode special characters but not html tags, for inclusion in a wordpress extended rss file 【发布时间】:2011-07-18 17:53:22 【问题描述】:

我编写了一个脚本,它将所有用户、博客和回复从现有(非 wordpress)站点导出到 wordpress 扩展 rss 文件,以便在迁移过程中导入到新的 wordpress 安装中。这很有效,直到涉及在法语或法语加拿大短语中带有特殊标点符号的特定博客文章。

XML Parsing Error: not well-formed
Location: http://example.com/wordpress_xml/export-to-wp.php
Line Number 2000, Column 270:* ... <i>l'art du d\uffffplacement</i> ... 

我已经裁剪了上面的完整错误。代替 \uffff 显示一个类似于逗号的字符。在 php 代码中,我将博客的 html 放在一个字符串中。我需要在不编码任何 html 标签的情况下对这种类型的字符进行编码,经过大量搜索,我到目前为止还是一片空白。有人做过类似的事情吗?

【问题讨论】:

好的,我已经对此进行了更深入的研究,并将添加字符应该是顶部带有重音的 e。这在原始站点上呈现良好,但在导出到 xml 时会引发不稳定。我认为这意味着我真正需要的是编码重音字符而不是 html 标签...... 您的内容采用哪种字符编码? @mario,不确定,但我自己解决了这个问题,见下文。有趣的是,在我提出这个问题之前,我是如何被困住的。它一直发生在我身上...... 【参考方案1】:

在发现问题与口音有关后,我在 php.net 上找到了以下函数,它们适用于我的案例,并且我生成的导出文件很好地导入了 wordpress 博客。

function xmlentities($string) 
    // Function from: http://php.net/manual/en/function.htmlentities.php
    // Posted by: snevi at im dot com dot ve 22-Jul-2008 01:10
    $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
    return $string;


function _privateXMLEntities($num) 
    // Function from: http://php.net/manual/en/function.htmlentities.php
    // Posted by: snevi at im dot com dot ve 22-Jul-2008 01:10
        $chars = array(
    128 => '&#8364;',
    130 => '&#8218;',
    131 => '&#402;',
    132 => '&#8222;',
    133 => '&#8230;',
    134 => '&#8224;',
    135 => '&#8225;',
    136 => '&#710;',
    137 => '&#8240;',
    138 => '&#352;',
    139 => '&#8249;',
    140 => '&#338;',
    142 => '&#381;',
    145 => '&#8216;',
    146 => '&#8217;',
    147 => '&#8220;',
    148 => '&#8221;',
    149 => '&#8226;',
    150 => '&#8211;',
    151 => '&#8212;',
    152 => '&#732;',
    153 => '&#8482;',
    154 => '&#353;',
    155 => '&#8250;',
    156 => '&#339;',
    158 => '&#382;',
    159 => '&#376;');
    $num = ord($num);
    return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
 

【讨论】:

【参考方案2】:

对于 Latin-1,您可以通过以下方式轻松转义字符:

$html = preg_replace('/[\x80-\xFF]/e', '"&#x".dechex(ord("$0")).";"', $html);

对于 UTF-8,它涉及更多:

$html = preg_replace_callback("/(?!\w)\pL/u", "xmlent", $html);
function xmlent($m) 
    $str = mb_convert_encoding( $m[0] , "UCS-2BE", "UTF-8");
    return "&#x" . bin2hex($str) . ";";

【讨论】:

啊等等,这看起来比我的解决方案还要好。我猜这将处理所有字符,来自任何支持 unicode 的字母? 确实如此。它不依赖于固定列表,但应该能够处理所有 Unicode 字符。使用第二个版本,并可能在您的情况下事先申请$html=utf8_encode($html); 我应该这样做,因为我计划为其他想要从相同 cms 迁移到 wordpress 的人发布此导出代码,我不知道他们可能使用什么字符编码。也可以让它尽可能普遍有用。谢谢! 那么注意也要使用mb_detect_encoding()以避免双重转换,preg_replace可能会被非UTF8字符串混淆。

以上是关于需要 php 编码特殊字符而不是 html 标签,以便包含在 wordpress 扩展 rss 文件中的主要内容,如果未能解决你的问题,请参考以下文章

java如何转换富文本框中的中文编码格式,且把标签变成特殊字符

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

xss:利用编码特性绕过过滤

php正则,去掉除html标签外的所有空格/换行符等特殊字符?注:html标签内可能会有属性

PHP DomDocument - 自闭标签和特殊字符

PHP/HTML 中的所有特殊字符都是问号