Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php通过包含文本和添加属性来查找dom元素_Php - Fatal编程技术网

php通过包含文本和添加属性来查找dom元素

php通过包含文本和添加属性来查找dom元素,php,Php,我有以下html代码 <html> <head> <script> var text = "this is just an example"; </script> <? MPage::PlaceHolder("scipts") ?> </head> <body> <div> <?

我有以下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>

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