在PHP中将字符串解释为HTML

3

我正在学习PHP,目前还处于初级阶段,因此我想请教一些在线找不到的建议。

我有一个PHP文件,它获取了两个字符串:一个名称和大量HTML文本。

$name = $_POST['name'];
$content = $_POST['content'];

现在我想使用这两个东西来创建一个新的HTML文件并保存它。到目前为止,我已经成功地使它保存一个新的HTML文件并将名称用作<title>标签。现在我想要的是用我的HTML字符串替换(当前为空的)body,并解释为HTML格式。
这是创建我的标签:
$body = $doc->createElement('body');
$body = $root->appendChild($body);

现在我找到了两种方法来解决这个问题,但是都没有起作用:
解决方案1:
$content = $doc->createTextNode($content);
$content = $body->appendChild($content);

这会将我的HTML插入到正文中,但它解析为'<div id="lala">content</div>'。所以这不是我想要的。
解决方案2:
$content = $doc->loadHTML($content);

这实际上使得html文件以HTML的格式加载,但是现在它替换了我的整个HTML,像将CSS和JS添加到头部的操作现在实际上将被加在新的body下面,而不是在头部。因此:

$link_1 = $doc->createElement('link');
$link_1->setAttribute('rel','stylesheet');
$link_1->setAttribute('href','css/mystylesheet.min.css');
$link_1 = $head->appendChild($link_1);

基本上,我希望将我的字符串解释为HTML,并使其加载到正确的位置。我尝试将其更改为 $body->loadHTML($content),但这会导致内部错误。

有人知道我要找的PHP方法吗?谢谢!


方案2是正确的,你遇到了什么样的“内部错误”?你是否启用了错误报告? - Madara's Ghost
好的,这个代码没有报错,但它做的事情是:我通过上面的代码将我的CSS添加到头部。然后我使用$doc->loadHTML,链接将从我的头部消失,所以我只有我的新正文内容。如果我将其放置为$body->loadHTML,我会得到以下错误:<b>致命错误</b>:在<b>/Applications/MAMP/htdocs/template/js/createhtml.php</b>的第<b>35</b>行调用未定义的DOMElement::loadHTML()方法<br /> - Davy
@Mortaza,请检查我的答案。 - web-nomad
2个回答

4
这个会起作用。如果需要解释,请告诉我 :)
<?php
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );

$dom = new DOMDocument( '1.0' );
$dom->formatOutput = true;
$dom->preserveWhiteSpace = true;

// test values
$name = 'Test';
$content = '<div onclick="alert(\'Hello!\');">Test div</div>';

// create <html>, <head>, <title> and <body> tags
$html = $dom->createElement( 'html' );
$head = $dom->createElement( 'head' );
$title = $dom->createElement( 'title' );
$body = $dom->createElement( 'body' );

// title text
$titleText = $dom->createTextNode( $name );

// import the text in a new dom
$dom1 = new DOMDocument( '1.0' );
$dom1->formatOutput = true;
$dom1->preserveWhiteSpace = true;
$bodyText = $dom1->loadHTML( $content );
$bodyText = $dom1->getElementsByTagName('body')->item(0);

// add them to the dom
$html = $dom->appendChild( $html );

$html->appendChild( $head );
$head->appendChild( $title );
$title->appendChild( $titleText );

$html->appendChild( $body );
$bodyT = $dom->importNode( $bodyText, true );
$body->appendChild( $bodyT );
echo $dom->saveHTML();
?>

希望这有所帮助。

1
非常好,我试过了,稍微调整了一下,现在它对我有效 :). 我看到你的技巧是创建2个DOM,然后将第二个DOM的body-child导入到第一个DOM中,这样你仍然可以使用loadHTML来“替换所有”,所谓的。谢谢 :) - Davy

0
当然,createTextNode 中的 text 表示纯文本(而非 HTML)。

致命错误: 调用未定义方法 DOMElement::loadHTML()

正确的是,loadHTML() 属于 DOMDocument, 而不是 DOMElement。在你的情况下,文档显然是 $doc(而不是 $body)。所以你需要调用:

$doc->loadHTML()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接