【问题标题】:Change HTML content with PHP, Xpath and / or DOM [duplicate]使用 PHP、Xpath 和/或 DOM 更改 HTML 内容 [重复]
【发布时间】:2010-12-25 21:01:19
【问题描述】:

可能重复:
xPath insert before and after - With DOM and PHP

我需要以一种很好的正确方式解析字符串中的 HTML 代码。

Wordpress 创建一个侧边栏,其结构如下所示。

<div class="sidebar-1">
   <ul>
      <li id="archives">
          <h4>Archives</h4>
          <ul>
             <li>a href="">Test1</a></li>
             <li>a href="">Test2</a></li>
          </ul>
      </li>
      <li id="pages">
          <h4>Archives</h4>
          <ul>
             <li>a href="">Test</a></li>
             <li>a href="">Test</a></li>
          </ul>
      </li>
   </ul>

我想在 之后创建一个

并在 父元素之前创建一个
,在列表部分“档案”和“页面”中”。如果添加更多未知列表项,它应该可以工作。

结果应该是这样的:

<div class="sidebar-1">
   <ul>
      <li id="archives">
          <h4>Archives</h4>
          <div class="content">
             <ul>
                <li>a href="">Test1</a></li>
                <li>a href="">Test2</a></li>
             </ul>
          </div>
      </li>
      <li id="pages">
          <h4>Archives</h4>
          <div class="content">
             <ul>
                <li>a href="">Test</a></li>
                <li>a href="">Test</a></li>
             </ul>
          </div>
      </li>
   </ul>

我试图创建一个 DOM 函数,但我没有弄清楚需要做什么以及如何去做。它返回数组中 h4-tags 中的内容。不是很有帮助。

    function add_sidebar_content($html)
    {
       $dom = new DOMDocument();
       $dom->loadHTML($html);
       $xpath = new DomXPath($dom); 
       $tag = $dom->getElementsByTagName("h4");
       $counter = $tag->length;
       for ($i = 0; $i < $counter; $i++)
       {
          $result = $tag->item($i)->nodeValue;
       }
       return $result;
    }

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获取解释以及托管 XPath 的语言是 XSLT 的解决方案。
  • 嗯,自从我从事 WP 工作以来已经有一段时间了,但这不是主题相关的问题吗?
  • 是的,这是一个主题相关的问题,但是 Wordpress 主题系统非常灵活,并且接受 PHP 函数来解决问题。

标签: php html xslt dom xpath


【解决方案1】:

您可能应该使用挂钩来执行此操作,而不是尝试事后修改内容。我不确定你会使用哪个钩子,但是you can find all the hooks available here

【讨论】:

  • 感谢您提供更多信息。它不能解决问题,但无论如何都是有用的。
【解决方案2】:

XPath 是 XML 的查询语言,因此不能修改 XML 文档

为了修改 XML 文档,需要使用承载 XPath 的编程语言(例如 XSLT、C#、JS、PHP、...等)。

这是一个解决方案,其中宿主语言是 XSLT

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "li/ul[preceding-sibling::*[1]
         [self::h4 and .='Archives']
       ]">
  <div class="content">
   <xsl:call-template name="identity"/>
  </div>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于所提供的 XML 文档时(更正为格式正确):

<div class="sidebar-1">
    <ul>
        <li id="archives">
            <h4>Archives</h4>
            <ul>
                <li>
                    <a href="">Test1</a>
                </li>
                <li>
                    <a href="">Test2</a>
                </li>
            </ul>
        </li>
        <li id="pages">
            <h4>Archives</h4>
            <ul>
                <li>
                    <a href="">Test</a>
                </li>
                <li>
                    <a href="">Test</a>
                </li>
            </ul>
        </li>
    </ul>
</div>

产生想要的正确结果

<div class="sidebar-1">
   <ul>
      <li id="archives">
         <h4>Archives</h4>
         <div class="content">
            <ul>
               <li>
                  <a href="">Test1</a>
               </li>
               <li>
                  <a href="">Test2</a>
               </li>
            </ul>
         </div>
      </li>
      <li id="pages">
         <h4>Archives</h4>
         <div class="content">
            <ul>
               <li>
                  <a href="">Test</a>
               </li>
               <li>
                  <a href="">Test</a>
               </li>
            </ul>
         </div>
      </li>
   </ul>
</div>

【讨论】:

  • 我使用 PHP 和 HTML,而不是 XML 和 XSLT。 Wordpress 将 HTML 生成为 PHP 字符串。不知道有没有办法解决这个问题?
  • @Jens-Törnell:我可以向您保证,使用 XSLT 解决这个问题或任何树形结构数据的转换都是可行的方法。 XSLT 是一种专为树结构数据转换而设计的语言,因此它在这方面是最强大的。在 XSLT 中,您通常只需几行就可以指定一个复杂的转换——在其他语言中,这将需要非常具有挑战性的编码,并且会导致像意大利面条一样无法理解的代码。
  • 有趣。 XSLT 对我来说是新的。我在网上搜索并找到了这个 PHP 代码。 $parser = xslt_create(); $html = xslt_process($parser, "exampleDocument.xml", "exampleTemplate.xsl"); xslt_free($解析器);回声 $html;我想我可以在此基础上进行构建,但我有一个 PHP 字符串,而不是外部 XML 文档(示例需要)。
  • 我不懂 PHP。大多数 DOM 实现都有这样的方法:XmlDocument.LoadXml(someXmlString)
【解决方案3】:

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 2018-06-23
    • 2023-03-15
    相关资源
    最近更新 更多