PHP simplexml Entities - PullRequest
       8

PHP simplexml Entities

3 голосов
/ 17 мая 2010

Что здесь происходит?

<code>$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <album>
        <img src="002.jpg" caption="w&aacute;ssup?" />
    </album>
XML;

$xml = simplexml_load_string($string);
// $xmlobj = simplexml_load_file("xml.xml"); // same thing

echo "<pre>";
var_dump($xml);
echo "
";

Ошибка:

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: объект: строка 5: ошибка синтаксического анализатора: объект 'aacute' не определен

Ответы [ 5 ]

14 голосов
/ 17 мая 2010

&aacute не является сущностью XML - вы думаете о HTML.

Специальные символы обычно используются "как есть" в XML - html_entity_decode() на входных данных (не забудьте указать UTF-8 в качестве набора символов) должно помочь:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8");
2 голосов
/ 17 мая 2010

Возможно, вы захотите взглянуть на статью Мэтта Робинсона об альтернативном методе: Преобразование именованных сущностей в числовые в PHP . В нем упоминается метод html_entity_decode (уже указанный в другом ответе) и некоторые потенциальные ловушки:

У этого подхода есть две возможные проблемы. Первый - недопустимые объекты: html_entity_decode() не будет их трогать, что означает, что вы все равно получите ошибки XML. Второе - это кодирование. Я полагаю, вполне возможно, что вы на самом деле не хотите UTF-8. Вы должны, потому что это круто, но, возможно, у вас есть веская причина. Если вы не скажете html_entity_decode() использовать UTF-8, он не преобразует сущности, которые не существуют в указанном вами наборе символов. Если вы скажете ему выводить в UTF-8, а затем использовать что-то вроде iconv() для его преобразования, то вы потеряете все символы, которых нет в выходной кодировке.

Кроме того, если вы находите скрипт довольно громоздким, вы также можете использовать тот, который предоставлен на SourceRally .

2 голосов
/ 17 мая 2010

у меня была эта проблема на днях. любое появление & должно быть внутри тега CDATA

<album>
    <img src="002.jpg" />
    <caption><![CDATA[now you can put whatever characters you need & include html]]></caption>
</album> 

для предотвращения сбоя анализатора.

1 голос
/ 12 апреля 2014

Другое решение состоит в том, чтобы изменить

"w&aacute;ssup?" to "w&amp;aacute;ssup?"

0 голосов
/ 26 февраля 2018

Попробуйте эту функцию simplexml_load_entity_string

<?php

$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
    <album>
        <img src="002.jpg" caption="test&lt;w&aacute;ssup?" />
    </album>
XML;

$xml = simplexml_load_entity_string($string);

var_dump($xml);

function simplexml_load_entity_string($string = '')
{
    // cover entity except Predefined entities in XML
    $string = str_replace([
        '&quot;', '&amp;', '&apos;', '&lt;', '&gt;',
    ], [
        'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
    ], $string);
    $string = html_entity_decode($string, ENT_QUOTES, "utf-8");
    $string = str_replace([
        'SPECIALquotMARK', 'SPECIALampMARK', 'SPECIALaposMARK', 'SPECIALltMARK', 'SPECIALgtMARK',
    ], [
        '&quot;', '&amp;', '&apos;', '&lt;', '&gt;',
    ], $string);

    // load xml
    return simplexml_load_string($string);
}
...