private function sanitizeEscapedText($str)
    {
        $str = str_replace('&apos;', '&#39;', $str); // PHP's html_entity_decode doesn't seem to support that!

        /* <?php ?> blocks can't reliably work in attributes (due to escaping impossible in XML)
           so they have to be converted into special TALES expression
        */
        $types = version_compare(PHP_VERSION, '5.4.0') < 0 ? (ini_get('short_open_tag') ? 'php|=|' : 'php') : 'php|=';
        $str = preg_replace_callback("/<\?($types)(.*?)\?>/", array('self', 'convertPHPBlockToTALES'), $str);

        // corrects all non-entities and neutralizes potentially problematic CDATA end marker
        $str = strtr(preg_replace('/&(?!(?:#x?[a-f0-9]+|[a-z][a-z0-9]*);)/i', '&amp;', $str), array('<'=>'&lt;', ']]>'=>']]&gt;'));

        return $str;
    }
private function sanitizeEscapedText($str)
    {
        $str = str_replace('&apos;', '&#39;', $str); // PHP's html_entity_decode doesn't seem to support that!

        /* <?php ?> blocks can't reliably work in attributes (due to escaping impossible in XML)
           so they have to be converted into special TALES expression
        */
        $types = version_compare(PHP_VERSION, '5.4.0') < 0 ? (ini_get('short_open_tag') ? 'php|=|' : 'php') : 'php|=';
        $str = preg_replace_callback("/<\?($types)(.*?)\?>/", array('self', 'convertPHPBlockToTALES'), $str);

        // corrects all non-entities and neutralizes potentially problematic CDATA end marker
        $str = strtr(preg_replace('/&(?!(?:#x?[a-f0-9]+|[a-z][a-z0-9]*);)/i', '&amp;', $str), array('<'=>'&lt;', ']]>'=>']]&gt;'));

        return $str;
    }
private function sanitizeEscapedText ( $ str ) { $ str = str_replace ( '&apos;' , '&#39;' , $ str ) ; // PHP's html_entity_decode doesn't seem to support that! /* <?php ?> blocks can't reliably work in attributes (due to escaping impossible in XML)
           so they have to be converted into special TALES expression
        */ $ types = version_compare ( PHP_VERSION , '5.4.0' ) < 0 ? ( ini_get ( 'short_open_tag' ) ? 'php|=|' : 'php' ) : 'php|=' ; $ str = preg_replace_callback ( "/<\?($types)(.*?)\?>/" , array ( 'self' , 'convertPHPBlockToTALES' ) , $ str ) ; // corrects all non-entities and neutralizes potentially problematic CDATA end marker $ str = strtr ( preg_replace ( '/&(?!(?:#x?[a-f0-9]+|[a-z][a-z0-9]*);)/i' , '&amp;' , $ str ) , array ( '<' => '&lt;' , ']]>' => ']]&gt;' ) ) ; return $ str ; }
This is where this parser violates XML and refuses to be an annoying bastard.
This is where this parser violates XML and refuses to be an annoying bastard .