2011-08-26 126 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>