Экранирование амперсанта («&») в XML

Спецсимволы XML

#x9 [HT] Горизонтальная табуляция (horizontal tabulation)
#xA [LF] Перевод строки (line feed)
#xD [CR] Возврат каретки (carriage return)
#x20 [SP] Пробел (space)
#x21 ! Восклицательный знак (exclamation sign)
#x22 « Двойные кавычки (quotation mark)
#x26 & Амперсант (ampersand)
#x27 Апостроф или одинарные кавычки (apostrophe)
#x3C < «Знак «»меньше»» или левая угловая скобка (less-than sign)»
#x3F ? Вопросительный знак (question mark)
#xA0 [NBSP] Неразрываемый пробел (no-break space)

 

Специальную роль в разметке XML играет символ &.

Употребление разметочных символов в символьных данных затрудняет распознавание конструкций разметки и может создать проблему неоднозначности структуры.

В XML эта проблема решается заменой «&» -> «&amp;».

Через PHP это делается не сложной регуляркой:

$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&'.substr('\\0',1))", $s);

UPD: Итоговый код получился таким:

		$tpl_output = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&'.substr('\\0',1))", $tpl_output);
		$tpl_output = preg_replace("/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/","&" ,html_entity_decode($tpl_output, ENT_COMPAT, 'UTF-8'));
Вы можете оставить комментарий ниже.