Вопрос

В настоящее время я сталкиваюсь с проблемой, когда элемент возвращается из моего xml-файла с одинарной кавычкой в нем.Это приводит к тому, что xml_parse разбивает его на несколько частей, например:Подключайтесь, Вы приняты на работу!Затем интерпретируется как "Get Wired, You" - это один объект, одинарная кавычка - второй, а "re Hired!" - третий.

То, что я хочу сделать, это:

while($data = fread($fp, 4096)){
        if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
            break;
        }
    }

Но это продолжает ломаться.Я могу запустить str_replace вместо htmlentities, и он запускается без проблем, но не хочет этого делать с htmlentities.

Есть какие-нибудь идеи?

Обновить: Согласно приведенному ниже ответу JimmyJ, я безуспешно попытался найти следующее решение (к вашему сведению, над связанным сообщением есть один или два ответа, которые обновляют код, связанный напрямую):

function XMLEntities($string)
    {
        $string = preg_replace('/[^\x09\x0A\x0D\x20-\x7F]/e', '_privateXMLEntities("$0")', $string);
        return $string;
    }

    function _privateXMLEntities($num)
    {
    $chars = array(
        39  => ''',
        128 => '€',
        130 => '‚',
        131 => 'ƒ',
        132 => '„',
        133 => '…',
        134 => '†',
        135 => '‡',
        136 => 'ˆ',
        137 => '‰',
        138 => 'Š',
        139 => '‹',
        140 => 'Œ',
        142 => 'Ž',
        145 => '‘',
        146 => '’',
        147 => '“',
        148 => '”',
        149 => '•',
        150 => '–',
        151 => '—',
        152 => '˜',
        153 => '™',
        154 => 'š',
        155 => '›',
        156 => 'œ',
        158 => 'ž',
        159 => 'Ÿ');
        $num = ord($num);
        return (($num > 127 && $num < 160) ? $chars[$num] : "&#".$num.";" );
    }
if(!xml_parse($xml_parser, XMLEntities($data), feof($fp))) {
            break;
        }

Обновить: Согласно приведенному ниже вопросу Тома, magic quotes действительно отключен.

Решение: В итоге я сделал для решения этой проблемы следующее:

После сбора данных для каждого отдельного элемента / публикации / etc я сохраняю эти данные в массиве, который позже использую для вывода, затем очищаю локальные переменные, использованные во время сбора.Я добавил шаг, который проверяет, присутствуют ли данные уже, и если они есть, я объединяю их до конца, а не перезаписываю.

Итак, если в итоге у меня получится три фрагмента (как указано выше, давайте придерживаться "Подключайтесь, вы наняты!"), я перейду от выполнения

$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'

К выполнению:

$x = 'Get Wired, You' . "'" . 're Hired!'

Это не оптимальное решение, но, похоже, оно работает.

Это было полезно?

Решение

Почему бы вам не использовать что-то вроде simplexml_load_file для простого анализа вашего файла?

Другие советы

Я думаю, что включение магических кавычек иногда может испортить синтаксический анализ xml - это включено?.Вы можете отключить это во время выполнения, используя

set_magic_quotes_runtime(0);

Редактировать:это может быть неуместно, если источником не является post или get, но я читал в руководстве по PHP, что это в любом случае может вызвать странное поведение

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top