我想要的是使用一个 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 并需要一些指导,我可以尝试用小提琴手示例更新它。