php 用 DOM 提取一段 html 并插入新的 html


php extract piece of html with DOM and insert new html

我想要的是使用一个 html 片段作为带有占位符的模板并加载这个模板,填充内容并返回新的 html:

$html = '<table>
<tr id="extra">
    <td>###EXTRATITLE###</td>
    <td>###EXTRATOTAL###</td>
</tr>
</table>';
$temp = new DOMDocument();
$temp->loadHTML($html);
$str = $temp->saveHTML($temp->getElementById('extra'));
$dom = new DOMDocument();
$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;
$element = $dom->getElementById('extra');
$element->parentNode->removeChild($element);
$data = [
    "key1" => "value1",
    "key2" => "value2",
];
foreach ($data as $key => $row) {
    $search = [ '###EXTRATITLE###', '###EXTRATOTAL###' ];
    $replace = [ $key, $row ];
    $el = $dom->createTextNode(str_replace($search, $replace, $str));
    $foo = $dom->documentElement->firstChild;
    $foo->appendChild($el);
}
echo preg_replace('~<(?:!DOCTYPE|/?(?:html|body))[^>]*>'s*~i', '', $dom->saveHTML());

问题是实体和孩子的错误放置 - 任何人都可以解决这个问题吗?

假设您有一个这样的数据映射数组:

$data = array(
    'PLACEHOLDER1' => 'data 1',
    'PLACEHOLDER2' => 'data 2',
);

以下是您可以执行的操作:

$html = '<table>
<tr id="myselector">
    <td>###PLACEHOLDER1###</td>
    <td>###PLACEHOLDER2###</td>
</tr>
</table>';
foreach( array_keys( $data ) as $key )
{
    $html = str_replace( '###'.$key.'###', $data[ $key ], $html );
}

这是一种替代方法:

$html = '<table><tr id="myselector"></tr></table>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$tr = $doc->getElementById('myselector');
foreach ($data as $row) {
    $td = $doc->createElement('td', $row['value']);
    $tr->appendChild($td);
    //repeat as necessary
}

它不使用占位符,但应该产生所需的结果。


如果目标是从头开始创建更复杂的模板系统,那么仔细阅读 XPath 文档并利用关联的 XPath 类可能更有意义。

我想知道为什么你使用PHP而不是JQuery - 这使得这变得超级容易。我的意思是,我知道你可以,但我不确定你是否在帮自己什么忙。

我有一个类似的要求,我想使用模板并获取服务器端值。我最终做的是创建一个服务器端数组并将其转换为 JSON - 在 php json_encode($the_data_array);

然后我有一个模板的常设脚本部分,它使用 jQuery 选择器来获取和设置值。这真的很干净,并且更容易调试,试图从 php 生成整个 HTML 有效负载。这也意味着我可以更轻松地将数据文件与模板分开,以便以后更好地缓存和更新。

如果您不熟悉 jQuery 并需要一些指导,我可以尝试用小提琴手示例更新它。

相关文章: