在PHP中将字符串解释为HTML

时间:2014-05-13 07:55:48

标签: php html dom

我正在研究PHP,我刚刚开始,所以我想就一些我似乎无法在网上找到的东西提出一些建议。

我有一个PHP文件,它有两个字符串:一个名字和很多HTML文本。

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

现在我想使用这些2创建一个新的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之类的东西现在实际上将在新主体之下,而不是在头部。就这样:

$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-&gt; loadHTML($ content),但这会给我一个内部错误。

有谁知道我正在寻找的PHP方法?谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

当然,createTextNode中的文字代表纯文本(与HTML相对)。

  

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

正确,loadHTML() belongs to DOMDocument,而非DOMElement。在您的情况下,文档显然是$doc(不是$body)。所以你需要打电话:

$doc->loadHTML()