XML или PHP, или кто-то ест моих персонажей

Я один плохой вопрос от того, чтобы меня запрещали с сайта, но это мне того стоит, я потратил много часов на то, чтобы найти проблему и отладить ее, и я просто не могу, я искал высокий и низкий для ответов, и я не знаю

Я использую PHP DOM Document Parser Object, и я импортирую XML-шаблон Wikipedia. В течение нескольких часов я использовал substr (), и мои ответы возвращались примерно на 14 символов. Итак, чтобы сократить длинную историю, оказывается, что несоответствие исходит от> и <, которые у меня есть в некоторых элементах

Я пробовал все, о чем я могу думать, все это UTF-8, я пробовал кастинг типов в строках, мои заголовки не отправляются как XML, это обычный вывод HTML, я пытался, я пробовал mb_substr () и substr ()

str_replace('<', '&lt;', $string); 

Это похоже на то, что я делаю, я не могу помешать этим персонажам исчезнуть в пропасть, но я не знаю, куда они идут

Надеюсь, кто-то может пролить свет на него

Изменить: Чтобы немного разобраться, я загрузил XML-файл прямо из википедии, одна строка в нем, например, такова:

 &lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt; 

Теперь, если я использую:

 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 &lt;

> to &gt;

& to &amp;

Затем любой (и все) синтаксические анализаторы должны делать следующее:

  1. Скажем, вам нужно установить текстовый узел (или значение атрибута) в строку как < my text & some more >

  2. то предположим, что это текстовый узел в теге XML <TextValue>

Согласно стандарту XML такой текст может быть представлен в документе XML в двух формах: <TextValue>&lt; my text &amp; some more &gt;</TextValue> <TextValue>&lt; my text &amp; some more &gt;</TextValue>

<TextValue><![CDATA[<my text & some more>]]></TextValue>

  1. Теперь любой парсер, который должен возвращать значение текстового узла из обоих презентаций, должен возвращать действительное строковое значение, а не кодированное XML-представление.
  2. Поскольку фактическая строка является < my text & some more > синтаксический анализатор выполняет декодирование XML и возвращает вам фактическое значение строки.

Это не связано с реализацией Parser (PHP, Java, DOM в браузерах или что-то еще. Это стандарт.

PS. Если у вас есть инструмент XML с возможностями XPath в руках, вы можете играть с этим примером и точно определить определенное поведение.

UPD: Таким образом, ваш XML-презентация: &lt;small&gt;(1, 2, 3, 4, 33, 34, 64, 65, 66)&lt;big&gt;&lt;br/&gt;

Тогда фактическая строка <small>(1, 2, 3, 4, 33, 34, 64, 65, 66)<big><br/> и, конечно, длина строки равна 49 не 67, а mb_substr($str, 1, 2) возвращает точно sm из фактического строкового значения, а не lt из XML-кодированного представления