【问题标题】:How to grab the contents of HTML tags?如何抓取 HTML 标签的内容?
【发布时间】:2010-09-07 12:15:32
【问题描述】:

嘿,所以我想做的是抓住第一段的内容。字符串$blog_post 包含很多段落,格式如下:

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>

我遇到的问题是我正在编写一个正则表达式来获取第一个 &lt;p&gt; 标记和第一个关闭 &lt;/p&gt; 标记之间的所有内容。但是,它抓住了第一个 &lt;p&gt; 标记和 last 关闭 &lt;/p&gt; 标记,这导致我抓住了所有东西。

这是我当前的代码:

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
   echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
  echo $blog_post;

【问题讨论】:

    标签: php html regex html-parsing


    【解决方案1】:

    好吧,假设段落中没有其他 html,sysrqb 会让您匹配第一段中的任何内容。你可能想要更多这样的东西

    <p>.*?</p>
    

    ? 放在* 之后使其不是贪婪的,这意味着它只会在匹配&lt;/p&gt; 之前匹配尽可能少的文本。

    【讨论】:

      【解决方案2】:

      如果您使用 preg_match,请使用 "U" 标志使其不贪婪。

      preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
      

      $matches[1] 将包含第一段。

      【讨论】:

        【解决方案3】:

        使用strpos() 查找第一个位置可能会更容易和更快

         <p>
        

        首先

        </p>
        

        然后使用substr() 提取段落。

         $paragraph_start = strpos($blog_post, '<p>');
         $paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
         $paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));
        

        编辑:实际上其他人的答案中的正则表达式会更容易和更快......你在问题中的大复杂正则表达式让我感到困惑......

        【讨论】:

          【解决方案4】:

          使用正则表达式进行 html 解析永远不是正确的解决方案。对于这种特殊情况,您应该使用 XPATH:

          $string = <<<XML
          <a>
           <b>
            <c>texto</c>
            <c>cosas</c>
           </b>
           <d>
            <c>código</c>
           </d>
          </a>
          XML;
          
          $xml = new SimpleXMLElement($string);
          
          /* Busca <a><b><c> */
          $resultado = $xml->xpath('//p[1]');
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-19
            • 1970-01-01
            • 2019-12-21
            • 1970-01-01
            • 1970-01-01
            • 2011-11-26
            • 1970-01-01
            相关资源
            最近更新 更多