Спецсимволы 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 эта проблема решается заменой «&» -> «&».
Через 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')); |