Нужен php для кодирования специальных символов, но не тегов html, для включения в расширенный rss-файл wordpress - PullRequest
2 голосов
/ 19 марта 2011

Я написал скрипт, который будет экспортировать всех пользователей, блоги и ответы с существующего (не WordPress) сайта в расширенный rss-файл wordpress для простоты импорта в новую установку 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 ]

4 голосов
/ 19 марта 2011

Для 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 голос
/ 19 марта 2011

После обнаружения проблемы, связанной с акцентами, я обнаружил следующие функции, размещенные на 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.";" );
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...