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, Я попытался поместить все три выше кода, который использует это, и ниже. Ничто не помогает на самом деле запустить кодовый путь первого обратного вызова.

Что я делаю неправильно?

0 ответов

Другие вопросы по тегам