【问题标题】:How to find the last paragraph element?如何找到最后一个段落元素?
【发布时间】:2015-01-19 07:55:34
【问题描述】:

我有几个段落标签的列表。每个都没有任何属性,例如

<p>First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>

我的目标是找到最后一个开头的&lt;p&gt; 标签——不管我只有一个段落还是十个段落。我总是想要最后一段的开始标签。

/<p>/

我得到了第一段标签。我认为$ 将搜索方向从左到右反转为从右到左。所以基本上

/<p>$/

应该返回我上面示例中第三段的开头段落标记;但正则表达式什么也没找到。

那么如何最好地定位最后一段呢?

【问题讨论】:

  • 要清楚,你想要 1) 最后一个段落的开始标记或 2) 最后一个段落元素,从它的开头开始标记?区别很重要,但 1) 似乎没有什么意义,因为在这种情况下,最后一个开始段落标记...当然 与任何前面的开始段落标记没有什么不同(除非您对输入字符串中的索引感兴趣)。
  • @j0e3gan 我想要案例 1)。我在 wordpress 函数中执行preg_replace。我想将一个类应用于最后一个打开的p 标签并在之后添加一个填充。该函数仅针对使用包装 p 标记的 ACF 插件的字段,这些字段仅是所见即所得的字段。我本可以为字段使用包装 div 并在 CSS 中使用 :last-child,但我不喜欢扩展 html 标记。这样我只在某个页面上使用该功能,并且只在所见即所得字段上,用户可以在之后输入额外的段落,并且该类仍然应用于每个最后一个 p 标签。

标签: php regex


【解决方案1】:

$ 不改变搜索方向,它只是匹配到文本的末尾,仅此而已。

如果你想找到最后一个&lt;p&gt;,你必须使用否定的lookahead来断言&lt;p&gt;不再出现:

(?s)<p>(?!.*<p>)

【讨论】:

    【解决方案2】:

    使用这种模式

    [\s\S]*\K(<p>)
    

    Demo

    【讨论】:

      【解决方案3】:

      这应该可行:

      preg_match_all('#<p>.*</p>#',$string,$results);
      $last_paragraph = array_pop($results[0]);
      

      【讨论】:

        【解决方案4】:
        $str = <<<MYFILE
        <p>First paragraph</p>
        <p>Second paragraph</p>
        <p>Third paragraph</p>
        MYFILE;
        $matches = array();
        $pattern = '/.*?(<p>(.*)<\/p>)$/';
        preg_match($pattern,$str,$matches);
        
        var_dump($matches);
        

        【讨论】:

          【解决方案5】:

          试试这样的:

          (<p>)([^<]*)<\/p>$
          

          Debuggex Demo

          这是一个 PHP 演示,用于使用您提供的示例输入来测试模式...

          <?php 
          
          $test = <<<TEST
          <p>First paragraph</p>
          <p>Second paragraph</p>
          <p>Third paragraph</p>
          TEST;
          
          preg_match('/<p>([^<]*)<\/p>$/', $test, $matches);
          
          var_dump($matches);
          
          ?>
          

          ...,输出:

          array(3) {
            [0]=>
            string(22) "<p>Third paragraph</p>"
            [1]=>
            string(3) "<p>"
            [2]=>
            string(15) "Third paragraph"
          }
          

          你也可以run the PHP demo on Ideone

          如您所见,该模式匹配最后一个段落元素。我刚刚为捕获组添加了括号,让您可以选择获取最后一个段落元素本身它的开始标记它的文本。

          【讨论】:

            【解决方案6】:

            带有 XPath 的 DOM 方法

            $doc = new DOMDocument();
            $doc->loadHTML("<p>First paragraph</p><p>Second paragraph</p><p>Third paragraph</p>");
            
            $xpath = new DOMXpath($doc);
            if($elements = $xpath->query("//p[last()]"))
            {
              echo $elements->item(0)->nodeName; // p
              echo $elements->item(0)->nodeValue; // Third paragraph
            }
            

            如果您有一个更复杂的 HTML 结构,那么您将不得不开始使用您的 XPath 查询来显式化。

            【讨论】:

              猜你喜欢
              • 2013-04-11
              • 2010-11-17
              • 2018-04-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-06-26
              • 1970-01-01
              相关资源
              最近更新 更多