PHP DOM Manipulation - PullRequest
       0

PHP DOM Manipulation

2 голосов
/ 26 августа 2011

У меня есть шаблон в моей БД со стилем, созданным пользователем. Поскольку пользователи, как правило, глупы, а также я не хочу, чтобы они вмешивались в php-код, я хочу вставить фактические значения в их стиль перед отображением шаблона. Это динамические значения.

Так что у меня есть такие вещи, как

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

Заполнитель для значения. Это, наверное, самый простой способ. Я не могу / не хочу использовать jQuery здесь, но я хочу что-то подобное.

Я видел PHP-класс DOMDocument, который, кажется, справляется с одной задачей: $dom->saveHTML(), похоже, всегда сохраняет все дерево HTML. $dom->saveHTML($element) сохраняет только этот элемент, но у меня есть несколько одновременно в моем шаблоне.

Есть ли хитрость, чтобы все они были сохранены без HTML-кода?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Вы можете использовать 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>
1 голос
/ 26 августа 2011

saveHTML() сохраняет сам элемент и все его дочерние элементы.

Вы можете сохранить узел body для сохранения всего содержимого документа:

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...