Я пытаюсь записать в файл XML, используя DOMDocument ссылку, содержащую знак &. Когда я попробую это, ссылка станет & в xml. Таким образом, из product=1&qty;=1
становится product=1&qty;=1
.
Не могли бы вы рассказать мне, как избежать этого?
Амперсанды должны быть закодированы следующим образом. Сменить это было бы неправильно.
Символ амперсанда (&) и левая угловая скобка (<) НЕ ДОЛЖНЫ появляться в их литеральной форме, за исключением случаев, когда они используются в качестве разделителей разметки или в комментарии, инструкции обработки или секции CDATA. Если они необходимы в другом месте, они ДОЛЖНЫ быть экранированы с использованием либо числовых ссылок на символы, либо строк
&
и<
соответственно.
и http://www.w3.org/TR/xhtml1/#C_12
В SGML и XML символ амперсанда («&») объявляет начало ссылки на сущность (например,
®
для зарегистрированного символа товарного знака «®»). К сожалению, многие пользовательские агенты HTML молча игнорировали неправильное использование символа амперсанда в HTML-документах – обработка амперсандов, которые не похожи на ссылки на сущности как на литературные амперсанды. Пользовательские агенты на основе XML не будут терпеть это неправильное использование, и любой документ, который использует амперсанд неправильно, не будет «действительным» и, следовательно, не будет соответствовать этой спецификации. Чтобы гарантировать совместимость документов с историческими пользовательскими агентами HTML и пользовательскими агентами на основе XML, амперсанды, используемые в документе, которые должны обрабатываться буквальными символами, должны быть выражены как ссылка на сущность (например, «&
»). Например, когда атрибут href элемента a ссылается на скрипт CGI, который принимает параметры, он должен быть выражен какhttp://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
а не какhttp://my.site.dom/cgi-bin/myscript.pl?class=guest&name=user
Как сказал Гордон, URI кодируются таким образом. Если вы не кодировали &
&
, файл XML будет испорчен – вы получите ошибки, анализируя его. Когда вы берете строку обратно из XML-файла, если параметр &
все еще отображается, str_replace()
следующим образом:
$str = str_replace('&', '&', $str)
Или используйте htmlspecialchars_decode()
:
$str = htmlspecialchars_decode($str);
Добавленный бонус использования htmlspecialchars_decode()
заключается в том, что он расшифрует любой другой HTML- htmlspecialchars_decode()
который может быть в строке. Подробнее см. Здесь .