0

私はいくつかのHTMLDOM操作を行っています:

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を解析するにはどうすればよいですか?

4

2 に答える 2

0

いつ、どこで、どのように$html変数を作成していますか?内部のphpを解析したいのは、その場所と時間です。後で吐き出そうとすると、文字列のように吐き出され、解析されません。

より明確にするために、$htmlその時点で含まれているphpを使用して変数を作成します。または、代わりにテンプレートを作成している可能性があります。その場合、あなたはそれを違ったやり方で行うでしょう。

$html変数が使用された後にphpコンテンツを入力しようとしている場合は、代わりにstr_replace()または他の同様の関数を使用して何らかの効果を得ることができます。

于 2012-12-12T17:50:39.620 に答える
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ファイルでテストされており、機能します。

于 2012-12-12T20:40:35.917 に答える