2011-08-26 124 views
2

我在我的数据库中有一个模板,样式由用户创建。因为用户通常很愚蠢,而且我也不希望他们干涉php代码,所以我想在模板呈现之前将实际值插入到他们的样式中。它是动态值。PHP DOM操纵

所以我有事情喜欢

<p>Here is your value:</p> 
<span id="value"></span> 
<p>Enjoy it!</p> 

一种价值占位符。这可能是最简单的方法。我不能/不想在这里使用jQuery,但我想要类似的东西。

我已经看到PHP的DOMDocument类,它似乎有伎俩,有一个问题:$dom->saveHTML()似乎总是保存整个HTML树。 $dom->saveHTML($element)只保存了那个元素,但我在模板中同时有几个。

有没有一种方法让他们都保存没有html的东西?

+0

我不能说我理解这里的问题......介意如果你更好地解释它?你需要保存多个元素而不使用它们之间的HTML吗? –

+0

所以你只需要身体标签/元素的内部HTML? – hakre

+0

我只需要模板的纯HTML。 – Lanbo

回答

1

saveHTML()保存元素本身及其所有子元素。

您可以保存身体节点保存整个文件内容:

$body = $doc->getElementsByTagName('body')->item(0); 
$html = $doc->saveHTML($body); 

// and remove <body></body> 
$html = substr($html, strlen('<body>'), -strlen('</body>')); 

或保存身体的孩子们一个个:

$html = ''; 
foreach($body->childNodes as $node) { 
    $html .= $doc->saveHTML($node); 
} 
1

可以使用的libxslt的XSLTProc

$html = <<<HTML 
<p>Here is your value:</p> 
<span id='value'></span> 
<p>Enjoy it!</p> 
HTML; 

$xslt = <<<XSL 
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 

<xsl:output encoding='UTF-8' method='html'/> 

<xsl:template match='/html/body/*'> 
    <xsl:copy-of select='.'/> 
</xsl:template> 

</xsl:stylesheet> 
XSL; 

$htmldoc = new DOMDocument(); 
$htmldoc->loadHTML($html); 
$xsltdoc = new DOMDocument(); 
$xsltdoc->loadXML($xslt); 

$xsltproc = new XSLTProcessor(); 
$xsltproc->importStylesheet($xsltdoc); 
print $xsltproc->transformToXML($htmldoc); 

输出:

<p>Here is your value:</p> 
<span id='value'></span> 
<p>Enjoy it!</p>