We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 32854
    • 9 Posts
    Вообщем при клепании рсс ленты столкнулся с проблемой, которая описывается вот таким образом (нагуглил, ссылка на оригинальный пост http://dimoning.ru/category/dev/xml никакого продактплейсмента):


    В моем предпоследнем проекте был пользовательский XML, куда заносились данные о товарах и предоставлялись партнерам в качестве рекламных материалов. XML выводился как обычный текст.

    Сам XML был составлен по всем «законам жанра» – определение <?xml?> в начале, указание кодировки, главного тега. Все теги были закрыты, ошибок не было.

    Браузеры, как Вы знаете, любят отображать XML по-своему. Оформлять его специальным образом. Этим занимается ФайрФокс и ИЕ (для Оперы нужен плагин). Чтобы было понятно о чем я, вот пример.

    Но мой XML почему-то так не отображался. Он отображался просто текстом, причем теги «пропадали» (оно и понятно, браузер не знает таких тегов, но не показывает их). Заказчик же, заметив это, решил, что у меня неправильный XML (понятно, что на сам файл это никак не сказывается).

    В чем было дело? Оказалось, что есть две причины на такое «неправильное» отображение.

    1) Нужно передать заголовок Content-Type: text/xml; charset=utf-8. Отличается от «обычного» он типом контента (обычно text/html). В PHP заголовок передается так: header («Content-Type: text/xml; charset=utf-8″); (до вывода чего-либо, конечно). (к проблеме не относится)

    2) По непонятной мне причине XML не может содержать наоборов символов а-ля &nbsp;, но при этом может содержать аналогичные замены для кавычек, например. Также XML не может содержать HTML-теги внутри XML-тегов. То есть может-то может, но тогда браузер будет ругаться на него.

    Я написал небольшую функцию, через которую нужно пропустить текст до вывода в XML (скажем, описание товара). Она вырезает теги и некоторые недопустимые комбинации символов.

    function xml_check($c){
    $c = strip_tags ($c);
    $c = str_replace («&ndash;», «», $c);
    $c = str_replace («&nbsp;», «», $c);
    $c = str_replace («&ldquo;», «», $c);
    return $c;
    }

    Привожу выдержку, т.к. проще будет понять в чем проблема.

    Мое решение же состоит в том, чтобы в ditto.class.inc.php на строке 344 заменить
    return $output;

    на

    return preg_replace(’/&nbsp;/u’, ’’, $output);

    Регэксп не лучший вариант, но можете заменить на все, что вашей душе угодно. Или расширить его согласно тому посту выше.
    Короче, еще одно решение "на коленке" от меня. Альтернативы приветствуются ).



    Решение от AKots:
    Quote from: AKots at Jan 08, 2011, 04:08 AM

    Если посмотреть внимательнее, данные символы «портят» только заголовки, а в основном тексте вполне допустимы. Для того, чтобы их не было в заголовках, имеется в файле rss.format.inc.php cтрока:
    return htmlspecialchars(html_entity_decode($resource[’pagetitle’], ENT_QUOTES));
    однако проблема в том, что при кодировке UTF8 html_entity_decode работает неверно и подставляет непечатаемые символы. Если дописать:
    return htmlspecialchars(html_entity_decode($resource[’pagetitle’], ENT_QUOTES, ’UTF-8’));
    Все будет работать правильно.

    Конечно, лучше было бы проверять, какая кодировка установлена, и подставлять разные вызовы функции в различных случаях. Также надо внести аналогичные исправления в других местах, например, при формировании имени автора. А вообще в заголовках &nbsp; как-то не слишком уместны…
      • 785
      • 2,113 Posts
      Quote from: xfenix at Jan 07, 2011, 02:49 PM

      Мое решение же состоит в том, чтобы в ditto.class.inc.php на строке 344 заменить
      Очень плохое решение, так как для начала непонятно, зачем нужен preg_replace, когда достаточно str_replace, но дело даже не в этом, а в том, что править так радикально код Ditto плохо, ведь неразрывные пробелы в каких-то случаях могут понадобиться.

      Если посмотреть внимательнее, данные символы «портят» только заголовки, а в основном тексте вполне допустимы. Для того, чтобы их не было в заголовках, имеется в файле rss.format.inc.php cтрока:
      return htmlspecialchars(html_entity_decode($resource[’pagetitle’], ENT_QUOTES));
      однако проблема в том, что при кодировке UTF8 html_entity_decode работает неверно и подставляет непечатаемые символы. Если дописать:
      return htmlspecialchars(html_entity_decode($resource[’pagetitle’], ENT_QUOTES, ’UTF-8’));
      Все будет работать правильно.

      Конечно, лучше было бы проверять, какая кодировка установлена, и подставлять разные вызовы функции в различных случаях. Также надо внести аналогичные исправления в других местах, например, при формировании имени автора. А вообще в заголовках &nbsp; как-то не слишком уместны…
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 32854
        • 9 Posts
        Солидарен, потому и сказал, что на коленке. Если вы не против, я ваше решение в тело поста перекопирую.