PHP Regex删除最后一段(具有属性)和内容

时间:2016-01-02 13:50:16

标签: php regex

我的问题类似于Stackoverflow上提出的this问题。但是有区别。

我将以下内容存储在MySQL表中:

<p align="justify">First paragraph</p>
<p>Second paragraph</p>
<p>Third paragraph</p>
<div class="item">
<p>Some paragraph here</p>
<p><strong><u>Specs</u>:</strong><br /><br /><strong>Weight:</strong> 10kg<br /><br /><strong>LxWxH:</strong> 5mx1mx40cm</p
<p align="justify">second last para</p>
<p align="justify">This is the paragraph I am trying to remove with regex.</p>
</div>

我正在尝试删除表格中每一行的最后一个段落标记和内容。链接问题中提到的最佳答案表明遵循正则表达式 -

preg_replace('~(.*)<p>.*?</p>~', '$1', $html)

与关联问题的区别在于 - 有时我的最后一个段落标记可能 (或可能不会) 具有属性align="justify"。如果最后一个段落具有此属性,则提到的解决方案将删除没有属性的内容的最后一段。因此,我正在努力寻找删除最后一段的方法,无论其属性状态如何。< / p>

1 个答案:

答案 0 :(得分:1)

将正则表达式更改为:

preg_replace('~(.*)<p[^>]*>.*</p>\R?~s', '$1', $html)

Regex101 Demo

正则表达式突破

~           # Opening regex delimiter
  (.*)      # Select any chars matching till the last '<p>' tags
            # (actually it matches till the end then backtrack)
  <p[^>]*>  # select a '<p>' tag with any content inside '<p .... >'
            # the content chars after '<p' must not be the literal '>'
  .*        # select any char till the '</p>' closing tag
  </p>      # matches literal '</p>'
  \R?       # select (to remove it) any newline (\r\n, \r, \n)
~s          # Closing regex delimiter with 's' DOTALL flag 
            # (with 's' the '.' matches also newlines)