Мой вопрос похож на этот вопрос, заданный в 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"
. Если последний последний абзац имеет этот атрибут, то упомянутое решение удаляет последний абзац содержимого, не имеющего атрибутов. Итак, я изо всех сил пытаюсь найти способ удалить последний абзац, независимо от его статуса атрибутов.
Измените регулярное выражение на:
preg_replace('~(.*)<p[^>]*>.*</p>\R?~s', '$1', $html)
Вызов регулярного выражения
~ # 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)
**strong text**