我有以下HTML代码
<html>
<head>
<script>
var text = "this is just an example";
</script>
<? MPage::PlaceHolder("scipts") ?>
</head>
<body>
<div>
<? MPage::PlaceHolder("menu") ?>
</div>
<span>
<? MPage::PlaceHolder("content") ?>
<? MPage::PlaceHolder("footer") ?>
</span>
</body>
</html>
我想要的是找到包含MPage :: PlaceHolder(...)的所有元素,并在输出之前在 PHP 中添加一个名为mpage-placeholder =“...”的属性它
这样:
<div>
<? MPage::PlaceHolder("menu") ?>
</div>
变为:
<div mpage-placeholder="menu">
<? MPage::PlaceHolder("menu") ?>
</div>
这甚至可能吗??
欢呼声 c_bb
答案 0 :(得分:2)
使用PHP,您应该将其设为DOMDocument
,然后使用getElementsByTagName()
。这将返回DOMNodeList
,在这种情况下,它基本上是一个DOMElement对象的数组。现在,您可以遍历包含该值的元素。在getElements方法中使用通配符('*')
将返回一个可遍历的DOMNodeList,然后可以检查alle节点的值。这样的事情可以解决问题:
$input ='<html>...</html>'; // HTML contents in string
$dom = new DOMDocument();
$dom->loadHTML($input); // Convert HTML String into DOMDocument
$allNodes = $dom->getElementsByTagName('*'); // Get all DOMElements
foreach($allNodes as $node)
{
// If the node contains the value you want
if (strpos($node->nodeValue, "MPage::PlaceHolder") !== false)
{
// Give the node an attribute
$node->setAttribute("mpage-placeholder", "menu");
// If need be you can give the node's parent the attribute:
$node->parentNode->setAttribute("mpage-placeholder", "menu");
}
}
$xmlDoc->formatOutput = true;
$xmlDoc = $xmlDoc->saveHTML(); // Write DOMDocument back into a String
答案 1 :(得分:0)
您可以在脚本开头启动输出缓冲区(带ob_start
),以捕获输出的文本。
调用MPage::PlaceHolder()
函数时,您可以获取输出的文本(例如ob_get_contents
),然后分析输出的HTML以查找您想要进行的更改。
如果进行了任何更改,您可以使用ob_clean
清除缓冲区(但不删除它),然后打印修改后的HTML。
我不认为这非常有效,但它可能适合你。
修改强>
另一个想法是执行函数所做的任何操作(除了添加HTML属性之外),再添加一些特殊标记:例如:
<!-- MPAGE:SOMETHING -->
因此,在代码的末尾,您可以搜索所有这些标记并执行对父节点的搜索。如果您在标记打开后立即放置PHP,则此搜索可以变得非常简单。
编辑2
为了好玩,这个常规表达式会找到最后一个未关闭的html标记:
preg_match("/.*<((?![\\/?])[^>]+[^\\/])>(?!.*<\\/\\1>).*?$/s", $html, ...)
它可以与我提出的第一种方法一起使用。