【问题标题】:How can I find the contents of the first h3 tag?如何找到第一个 h3 标签的内容?
【发布时间】:2011-04-20 20:08:35
【问题描述】:

我正在寻找一个正则表达式来查找第一个 <h3> 标记的内容。我可以在那里使用什么?

【问题讨论】:

  • 使用正则表达式进行这种 HTML 解析通常是个坏主意。请参阅:stackoverflow.com/questions/1732348/… 使用适当的 HTML 解析器。
  • 如果你的 html 是 xhtml,你也可以使用 xpath 来达到这个目的。
  • PHP 具有解析 HTML DOM 的本机能力——您几乎肯定希望使用它而不是正则表达式。
  • 我不知道为什么这会被否决 - 对于新手来说这是一个合理的问题。
  • 我同意避免为此使用正则表达式的观点,但我认为所有的反对意见都有些苛刻——这不应该是一个你问问题的网站,因为你不知道吗?怎么办?

标签: php regex html-parsing


【解决方案1】:

嗯,一个简单的解决方案如下:

preg_match( '#<h3[^>]*>(.*?)</h3>#i', $text, $match );
echo $match[1];

对于更复杂的事情,您应该考虑使用 HTML 文档解析器。

【讨论】:

    【解决方案2】:
    preg_match("/&lt;h3&gt;(.*)&lt;\/h3&gt;/", $search_in_this_string, $put_matches_in_this_var);
    

    【讨论】:

    • 这里的表达式不正确(通常使用正则表达式是个坏主意)
    【解决方案3】:

    首先:正则表达式不是解析 HTML 代码的合适工具。但是在这种情况下,它们应该足够好,因为H3标签不能嵌套。

    preg_match_all('/<h3[^>]*>(.*?)<\/h3>/si', $source, $matches);
    

    $matches 变量应该包含来自H3 标签的内容。

    【讨论】:

    • 但是它们可以被注释掉,或者包含代码&lt;h3 title="Wibble&gt;Wobble"&gt;Wibble &amp;gt; Wobble&lt;/h3&gt;,或者类似的。
    【解决方案4】:

    PHP 具有本地解析 HTML DOM 的能力——您几乎肯定希望使用它而不是正则表达式。

    详情见此页面:http://php.net/manual/en/book.dom.php

    并检查右侧的相关问题是否有人提出非常相似的问题。

    【讨论】:

      【解决方案5】:

      Here 解释了为什么用正则表达式解析 HTML 是邪恶的。无论如何,这是一种方法......

      $doc = new DOMDocument();
      $doc->loadHTML($text);
      $headings = $doc->getElementsByTagName('h3');
      $heading = $headings->item(0);
      $heading_value = (isset($heading->nodeValue)) ? $heading->nodeValue : 'Header not found';
      

      【讨论】:

        【解决方案6】:

        您应该使用 php 的 DOM 解析器而不是正则表达式。你正在寻找这样的东西(未经测试的代码警告):

        $domd = new DOMDocument();
        libxml_use_internal_errors(true);
        $domd->loadHTML($html_content);
        libxml_use_internal_errors(false);
        
        $domx = new DOMXPath($domd);
        $items = $domx->query("//h3[position() = 1]");
        
        echo $items->item(0)->textContent;
        

        【讨论】:

        • 肯定比我的尝试更优雅:)
        【解决方案7】:

        DOM 方法:

        <?php
        
        $html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
        <html>
        <head><title></title>
        </head>
        <body>
        
        <h1>Lorem ipsum<h1>
        <h2>Dolor sit amet<h2>
        <h3>Duis quis velit est<h3>
        <p>Cras non tempor est.</p>
        <p>Maecenas nec libero leo.</p>
        <h3>Nulla eu ligula est</h3>
        <p>Suspendisse potenti.</p>
        
        </body>
        </html>
        ';
        
        $doc = new DOMDocument;
        $doc->loadHTML($html);
        
        $titles = $doc->getElementsByTagName('h3');
        if( !is_null($titles->item(0)) ){
            echo $titles->item(0)->nodeValue;
        }
        
        ?>
        

        【讨论】:

          【解决方案8】:

          使用 xpath 表达式,如

          "/html/body/h3[0]"
          

          这将选择整个第一个 h3 节点。

          请注意,这不适用于格式错误的 html。

          【讨论】:

          • 使用 DOM 的 loadHTML(),这将适用于真实世界(读取损坏的)HTML。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2014-10-06
          • 1970-01-01
          • 2021-06-11
          • 1970-01-01
          相关资源
          最近更新 更多