如何使用嵌入式PHP代码解析HTML?

时间:2012-12-12 17:37:40

标签: php dom

我正在做一些HTML DOM操作:

function parse_html($html) {
    $dom->loadHTML($html);
    libxml_clear_errors();

    // Parse DOM 

    return $dom->saveHTML();
}

问题是我的HTML包含一些PHP代码,其中一些是在HTML实体中转换的。例如,如果$html包含此内容:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?php // lang=es
    $pwd = $parameter['pwd'];
    $url = $parameter['url'];
?>

<p>
    You are now registered. Go to -&gt;
    <a href="<?php echo $url ?>">control panel</a> 
    to change the settings.
</p>

它改变了:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head>
<body>
<?php // lang=es
    $pwd = $parameter['pwd'];
    $url = $parameter['url'];
?><p> You are now registered. Go to -&gt; <a href="&lt;?php%20echo%20%24url%20?&gt;">control panel</a> to change the settings.
</p>
</body>
</html>

<?php echo $url ?>在实体中转换,但我不能使用像* html_entity_decode *这样的函数,因为它还会解码一些必须保留实体的实体。

如何解析包含PHP代码的DOM?

2 个答案:

答案 0 :(得分:0)

何时以及如何构建$html变量?它是在那个地方和时间你想要解析内部的PHP。如果你试图将它吐出来之后它会像只是一个字符串一样吐出来而且不会被解析。

更清楚的是,使用当时包含的php构建$html变量。或许您正在构建模板。在这种情况下,你会采用不同的方式。

如果您在$html变量发挥作用后尝试填写php内容,则可以使用str_replace()或其他类似函数来实现某些效果。

答案 1 :(得分:0)

我发现的解决方案是创建一些函数来编码/解码PHP字符串。

function encode_php($html) {
    return preg_replace_callback('#<\?php.*\?>#imsU', '_encode_php', $html);
}

function _encode_php($matches) {
    return 'PHP_ENCRYPTED_CODE_BEGIN'.base64_encode($matches[0]).'PHP_ENCRYPTED_CODE_END';
}

function decode_php($html) {
    return preg_replace_callback('#PHP_ENCRYPTED_CODE_BEGIN(.*)PHP_ENCRYPTED_CODE_END#imsU', '_decode_php', $html);
}

function _decode_php($matches) {
    return base64_decode($matches[1]);
}

选择您确定不会出现在文件中的前缀和后缀非常重要。此解决方案已经过2500个HTML文件的测试,可以使用。