Проблема с фидами и специальными символами в PHP и RSS - PullRequest
3 голосов
/ 16 января 2011

Я получаю следующее предупреждение проверки ниже.И мне было интересно, что некоторые из моих статей имеют дело со спецсимволами, и мне было интересно, как мне делать рендеринг или не рендеринг спецсимволов в RSS-каналах?Должен ли я использовать htmlentites или нет?Если да, то как?

Кроме того, совместимость с самым широким диапазоном считывателей каналов можно улучшить с помощью следующих рекомендаций.строка 22, столбец 35: заголовок не должен содержать HTML: &

код PHP.

<title>' . htmlentities(strip_tags($title), ENT_QUOTES, "UTF-8") . '</title>

Ответы [ 3 ]

1 голос
/ 16 января 2011

Вы должны использовать CDATA Чтобы экранировать символы в ваших XML-каналах, это позволяет вам использовать ваши необработанные данные без нарушения макета XML.

Попробуйте это:

<title><![CDATA[ YOUR RAW CONTENT]]></title>

Примечание: не используйте htmlentites и strip_tags, так как это избавит их от браузера, и любой другой читатель должен прочитать их правильно.

Qoute от w3schools:

Термин CDATA используется для обозначения текстовых данных, которые не должны анализироваться анализатором XML. Символы типа "<" и "&" недопустимы в элементах XML. "<" сгенерирует ошибку, потому что анализатор интерпретирует ее как начало нового элемента. "&" сгенерирует ошибку, потому что парсер интерпретирует ее как начало символьной сущности. Некоторый текст, например код JavaScript, содержит много символов "<" или "&". Во избежание ошибок код скрипта можно определить как CDATA. Все внутри секции CDATA игнорируется парсером. Раздел CDATA начинается с "":

http://www.w3schools.com/xml/xml_cdata.asp

1 голос
/ 14 февраля 2013

/ * feedvalidator.org (Feedburner рекомендует этот сайт для проверки ваших каналов) говорит: «Для самого широкого взаимодействия профиль RSS рекомендует использовать шестнадцатеричную символьную ссылку« & »для представления« & »и« <»дляпредставлять "<". * / </p>

        // find title problems
        $find[] = '<';
        $find[] = '\x92';
        $find[] = '\x84';

        // find content problems
        $find_c[] = '\x92';
        $find_c[] = '\x84';
        $find_c[] = '&nbsp;';

        // replace title
        $replace[] = '&#x3C;';
        $replace[] = '&#39;';
        $replace[] = '&#34;';

        // replace content
        $replace_c[] = '&#39;';
        $replace_c[] = '&#34;';
        $replace_c[] = ' ';

        // We don't want to re-replace "&" characters.  
        // So do this first because of PHP "feature" https://bugs.php.net/bug.php?id=33773
        $title = str_replace('&', '&#x26;', $title); 
        $title = str_replace($find, $replace, $title);
        $post_content = str_replace($find_c, $replace_c, $row[3]);

        // http://productforums.google.com/forum/#!topic/merchant-center/nIVyFrJsjpk
        $link = str_replace('&', '&amp;', $link);

Конечно, я делаю некоторую предварительную обработку перед добавлением $ title, $ post_content и $ link в мою базу данных. Но это должно помочь решить некоторые распространенные проблемыполучить действительный RSS-канал.

Обновление: исправлена ​​проблема & # x26; # x26; # x26; "рекурсия", см. https://bugs.php.net/bug.php?id=33773

0 голосов
/ 16 января 2011

Достаньте htmlentities(). Это только для файлов HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...