php通过包含文本和添加属性来查找dom元素
我有以下html代码php通过包含文本和添加属性来查找dom元素,php,Php,我有以下html代码 <html> <head> <script> var text = "this is just an example"; </script> <? MPage::PlaceHolder("scipts") ?> </head> <body> <div> <?
<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>
var text=“这只是一个示例”;
我不想找到包含MPage::PlaceHolder(…)的所有元素,并在PHP中添加名为MPage PlaceHolder=“…”的属性,然后再输出它
因此:
变成:
<div mpage-placeholder="menu">
<? MPage::PlaceHolder("menu") ?>
</div>
这可能吗
干杯
c_bb您可以在脚本开始时启动输出缓冲区(使用
ob_start
),以捕获输出的文本
调用MPage::PlaceHolder()
函数时,您可以获取输出的文本(例如,使用ob_get_contents
),然后分析输出的HTML以找到您想要做的更改
如果进行了任何更改,您可以使用ob_clean
清理缓冲区(但不删除它),然后打印修改后的HTML
我不认为这很有效,但它可能对你有用。
编辑:
另一个想法是执行该函数所做的任何操作(除了添加HTML属性),并添加一些特殊标记:例如:
<!-- MPAGE:SOMETHING -->
因此,在代码末尾,您可以搜索所有这些标记并执行父节点搜索。如果在标记打开后立即放置PHP,则此搜索将变得非常简单
编辑2
为了好玩,此常规表达式查找最后一个未关闭的html标记:
preg_match("/.*<((?![\\/?])[^>]+[^\\/])>(?!.*<\\/\\1>).*?$/s", $html, ...)
preg_match(“/.*]+[^\\/])>(?!..*?$/s“,$html,…)
它可以与我提出的第一种方法一起使用。使用PHP时,应该将其设置为a,然后使用。这将返回一个数组,在本例中,它基本上是一个domeElement对象数组。现在可以遍历包含该值的元素。在getElements方法中使用通配符
('*')
返回一个可遍历的DomainNodeList,然后可以从中检查所有节点的值。像这样的事情应该可以做到:
$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
$input='…';//字符串中的HTML内容
$dom=新的DOMDocument();
$dom->loadHTML($input);//将HTML字符串转换为DOMDocument
$allNodes=$dom->getElementsByTagName('*');//得到所有的家庭用品
foreach($allNodes作为$node)
{
//如果节点包含所需的值
if(strpos($node->nodeValue,“MPage::PlaceHolder”)!==false)
{
//为节点指定一个属性
$node->setAttribute(“mpage占位符”、“菜单”);
//如果需要,可以为节点的父节点提供以下属性:
$node->parentNode->setAttribute(“mpage占位符”、“菜单”);
}
}
$xmlDoc->formatOutput=true;
$xmlDoc=$xmlDoc->saveHTML();//将文档写回字符串
是的,但可能有更好的解决方案。你这样做的最终目标是什么?这是为了在我的php代码中保持一致性,我正在加载我的页面以使用mpage开始,然后在运行时我加载一些带有html代码的模块,我需要知道模块的内容放在哪里,并保持php的设置不变。。。你能分享解决方案吗?这就是我正在做的。。。问题是,当我在客户端通过ajax加载模块时,我需要在html代码中添加一个标识符,以便知道数据放在哪里!您需要编辑从调用ob\u get\u contents
的函数中获取的html。例如,您可以使用传递给MPage::PlaceHolder()
的参数来简化需要搜索的内容。例如,:应搜索的最后一次出现,并添加要添加的HTML属性。另一方面,HTML中的自定义命名属性必须以数据开头(例如数据占位符)。。。但是我不喜欢这个解决方案,必须有一个动态的方法来做,如果我决定在跨度中有一个脚本占位符怎么办。。。然后整个事情都不起作用,因为它在寻找头,或者它把它放在头上,它不应该去的地方!“调用MPage::PlaceHolder()函数时,可以获取输出的文本”。。。。还是不知道这样哪个是父节点!
$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