В настоящее время я сталкиваюсь с проблемой, когда элемент возвращается из моего xml-файла с одной цитатой в нем. Это приводит к тому, что xml_parse разбивает его на несколько фрагментов, например: Get Wired, You're Hired! Затем вводится в сообщение как «Получить проводной, вы», являющийся одним объектом, причем одна цитата является секундой и «нанимается!». как третий.Анализ синтаксиса XML с одиночными кавычками?
То, что я хочу сделать, это:
while($data = fread($fp, 4096)){
if(!xml_parse($xml_parser, htmlentities($data,ENT_QUOTES), feof($fp))) {
break;
}
}
Но что удерживает разрыв. Я могу запустить str_replace вместо htmlentities, и он работает без проблем, но не хочет с htmlentities.
Любые идеи?
Update: Согласно ответа JimmyJ в поле ниже, я попытался следующее решение без везения (FYI есть ответ или два выше связанного пост, который обновляет код, который связан непосредственно):
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;
}
Обновление: В соответствии с вопросом ниже, магические кавычки действительно/отключены.
Решение: То, что я в конечном итоге делает, чтобы решить эту проблему, заключается в следующем:
После сбора данных для каждого отдельного элемента/запись/и т.д., хранить эти данные в массив, который я использую позже для вывода, затем очистите локальные переменные, используемые во время сбора. Я добавил шаг, который проверяет, присутствуют ли данные, и если это так, я конкатенирую его до конца, а не перезаписываю.
Так что, если я в конечном итоге с тремя кусками (как выше, давайте придерживаться, я буду затем делать
$x = 'Get Wired, You'
$x = "'"
$x = 're Hired!'
делать "Get Wired, Вы Наемные!:
.$x = 'Get Wired, You' . "'" . 're Hired!'
Это не является оптимальным решением, но, кажется, работает