Я один плохой вопрос от того, чтобы меня запрещали с сайта, но это мне того стоит, я потратил много часов на то, чтобы найти проблему и отладить ее, и я просто не могу, я искал высокий и низкий для ответов, и я не знаю
Я использую PHP DOM Document Parser Object, и я импортирую XML-шаблон Wikipedia. В течение нескольких часов я использовал substr (), и мои ответы возвращались примерно на 14 символов. Итак, чтобы сократить длинную историю, оказывается, что несоответствие исходит от> и <, которые у меня есть в некоторых элементах
Я пробовал все, о чем я могу думать, все это UTF-8, я пробовал кастинг типов в строках, мои заголовки не отправляются как XML, это обычный вывод HTML, я пытался, я пробовал mb_substr () и substr ()
str_replace('<', '<', $string);
Это похоже на то, что я делаю, я не могу помешать этим персонажам исчезнуть в пропасть, но я не знаю, куда они идут
Надеюсь, кто-то может пролить свет на него
Изменить: Чтобы немного разобраться, я загрузил XML-файл прямо из википедии, одна строка в нем, например, такова:
<small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
Теперь, если я использую:
dd(mb_substr($str, 1, 2))
Я бы ожидал «lt», но на самом деле то, что я получаю, это «sm», он обрабатывает «<» как один символ, но если я открою файл в Sublime, Notepad ++, EmEditor и т. Д., Это будет 4 персонажи
Я не понимаю, как PHP обрабатывает строку, даже если я использую str_replace (), она отказывается стать объектом HTML
Edit2:
Если вы перейдете по этому адресу:
https://en.wikipedia.org/wiki/Special:Export
и введите «Лондон» в поле, он загрузит XML-файл
В классе или в любом случае используйте этот код:
$this->file = new \DOMDocument; $this->file->load('C:\path-to-your-xm-file.xml'); $pages = $this->file->getElementsByTagName('page'); foreach($pages as $page) { die(mb_substr($page->getElementsByTagName('text')->item(0)->nodeValue, 343, 1)); }
Теперь 344-й символ должен быть амперсандом, но вместо этого он дает весь «<»
В моем понимании речь идет о синтаксическом анализаторе XML. По стандарту XML три символа должны быть закодированы и декодированы как:
'< ' to <
> to >
& to &
Затем любой (и все) синтаксические анализаторы должны делать следующее:
Скажем, вам нужно установить текстовый узел (или значение атрибута) в строку как < my text & some more >
то предположим, что это текстовый узел в теге XML <TextValue>
Согласно стандарту XML такой текст может быть представлен в документе XML в двух формах: <TextValue>< my text & some more ></TextValue>
<TextValue>< my text & some more ></TextValue>
<TextValue><![CDATA[<my text & some more>]]></TextValue>
< my text & some more >
синтаксический анализатор выполняет декодирование XML и возвращает вам фактическое значение строки. Это не связано с реализацией Parser (PHP, Java, DOM в браузерах или что-то еще. Это стандарт.
PS. Если у вас есть инструмент XML с возможностями XPath в руках, вы можете играть с этим примером и точно определить определенное поведение.
UPD: Таким образом, ваш XML-презентация: <small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
Тогда фактическая строка <small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/>
и, конечно, длина строки равна 49 не 67, а mb_substr($str, 1, 2)
возвращает точно sm
из фактического строкового значения, а не lt
из XML-кодированного представления