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

时间:2011-03-19 12:55:23

标签: php html xml wordpress rss

我编写了一个脚本,将所有用户,博客和回复从现有(非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标签,经过大量搜索后我到目前为止画了一个空白。有人已经做过这样的事吗?

2 个答案:

答案 0 :(得分:4)

对于Latin-1,您可以使用以下方法轻松转义字符:

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

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

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

答案 1 :(得分: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.";" );
}