Разбор XML с помощью одинарных кавычек?
-
02-07-2019 - |
Вопрос
В настоящее время я сталкиваюсь с проблемой, когда элемент возвращается из моего 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, что это в любом случае может вызвать странное поведение