php通过包含文本并添加属性

时间:2016-02-11 10:36:01

标签: php

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

2 个答案:

答案 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, ...)

它可以与我提出的第一种方法一起使用。