PHP RegEx удалить пустые теги абзацев

Я пытаюсь удалить все пустые <p> теги CKEditor вставляется в поле описания, но все они, похоже, различаются. Возможности кажутся:

<p></p>

<p>(WHITESPACE)</p>

<p>&nbsp;</p>

<p><br /></p>

<p>(NEWLINE)&nbsp;</p>

<p>(NEWLINE)<br /><br />(NEWLINE)&nbsp;</p>

С этими возможностями может быть любое количество пробелов,&nbsp; и <br /> теги между абзацами, и могут быть некоторые из каждого вида в одном абзаце.

Я также не уверен в <br /> - тег, от того, что я видел, это может быть <br />, <br/> или <br>.

Я искал аналогичный ответ, но из всех ответов, которые я видел, все они, похоже, предназначены только для одного из этих случаев, а не для всех сразу. Я думаю, в простых терминах, что я спрашиваю, есть ли регулярное выражение, которое я могу использовать для удаления всех <p> теги из некоторого HTML, в которых нет буквенно-цифрового текста или символов/знаков препинания?

2 ответов


Ну, в конфликте с моим предложением не разбирать HTML с regexes, я написал регулярное выражение, чтобы сделать именно это:

"#<p>(\s|&nbsp;|</?\s?br\s?/?>)*</?p>#"

Это будет соответствовать должным образом для:

<p></p>

<p> </p> <!-- ([space]) -->

<p> </p> <!-- (That's a [tab] character in there -->

<p>&nbsp;</p>

<p><br /></p>

<p>
&nbsp;</p>

<p>
<br /><br />
&nbsp;</p>

принцип действия:

# /                --> Regex start
# <p>              --> match the opening <p> tag
# (                --> group open.
#   \s             --> match any whitespace character (newline, space, tab)
# |                --> or
#   &nbsp;         --> match &nbsp;
# |                --> or
#   </?\s?br\s?/?> --> match the <br> tag
# )*               --> group close, match any number of any of the elements in the group
# </?p>            --> match the closing </p> tag ("/" optional)
# /                --> regex end.

выбранный ответ отличный, но он не работает, если <p> тег имеет встроенные атрибуты стиля, такие как <p style="font-weight:bold">.

регулярное выражение, чтобы соответствовать этому, было бы:

#<p[^>]*>(\s|&nbsp;|</?\s?br\s?/?>)*</?p>#