PHP Regex для удаления последнего абзаца (имеющего атрибуты) и содержимого

1

Мой вопрос похож на этот вопрос, заданный в Stackoverflow. Но есть разница.

В таблице 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". Если последний последний абзац имеет этот атрибут, то упомянутое решение удаляет последний абзац содержимого, не имеющего атрибутов. Итак, я изо всех сил пытаюсь найти способ удалить последний абзац, независимо от его статуса атрибутов.

  • 0
    Возможная копия повторяющихся открытых тегов RegEx, за исключением автономных тегов XHTML
  • 0
    @LucasTrzesniewski Спасибо за ссылку. Хотя я не совсем понял это, я добавил это в закладки.
Показать ещё 2 комментария
Теги:

1 ответ

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)
  • 0
    Благодарю. Это сработало. Я думаю, что вам нужно отредактировать ответ и удалить этот текст из регулярного выражения => **strong text**
  • 0
    @ Dr.AtulTiwari: спасибо, как ни странно, когда я что-то вставляю!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню