Preg_replace_callback не вызывает обратный вызов
Я пытаюсь написать функцию PHP для экранирования тегов HTML внутри текстовых узлов XML, чтобы simplexml_load_string
не анализирует их и не добавляет к структуре данных, которые он создает.
/**
* 1. Find text nodes, pass their contents to escapeTextNode()
* 2. In escapeTextNode, find tags and pass them along (with their attributes) to escapeHtmlTag()
* 3. In escapeHtmlTag, escape tag into entities (w/ flags: double quotes, handle as XML), return back to escapeTextNode()
* 4. Finally, in escapeHtmlTag, replace all whitespace with a single space before returning.
*
* $matches[0] is the complete match, $matches[1] matches first sub-pattern and so on.
*/
function escapeHtmlTag($matches) {
$htmlEscaped = htmlentities($matches[0], ENT_XML1 | ENT_COMPAT, 'UTF-8');
return $htmlEscaped;
}
function escapeTextNode($matches) {
echo 'got here 2';
$htmlRegex = '/(\<.+?\/?\>)/u'; //captures html open/close tags w/ attributes
$htmlEscaped = preg_replace_callback($htmlRegex, 'escapeHtmlTag', $matches[0]);
$whitespaceTrimmed = preg_replace('/\s+/', ' ', trim($htmlEscaped));
return $whitespaceTrimmed;
}
function replaceTextNode($text) {
echo 'got here 1<br><pre>'; print_r($text); echo '</pre><br>';
$textNodeRegex = '/(?<=\<text\>)(.+)(?=\<\/text>)/sUu'; //captures _contents_ of <text>...</text>
$ret = preg_replace_callback($textNodeRegex, 'escapeTextNode', $text);
echo 'got here 3<br><pre>'; print_r($ret); echo '</pre><br>';
return $ret;
}
Я использую это следующим образом:
$xmlObj = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT);
$xmlObj = replaceTextNode($xmlObj);
Это работало в простом тестовом файле index.php, но когда я помещаю его в нашу кодовую базу, он не печатает got here 2
, Это печатает got here 1
а также got here 3
, но без значения ret
, Я попытался поместить параметр обратного вызова в качестве анонимной функции, без кавычек и с $
спереди. Я также попытался вложить два обратных вызова в replaceTextNodeHtml
, Я попытался поместить все три выше кода, который использует это, и ниже. Ничто не помогает на самом деле запустить кодовый путь первого обратного вызова.
Что я делаю неправильно?