PHP RegEx удалить пустые теги абзацев
Я пытаюсь удалить все пустые <p>
теги CKEditor вставляется в поле описания, но все они, похоже, различаются. Возможности кажутся:
<p></p>
<p>(WHITESPACE)</p>
<p> </p>
<p><br /></p>
<p>(NEWLINE) </p>
<p>(NEWLINE)<br /><br />(NEWLINE) </p>
С этими возможностями может быть любое количество пробелов,
и <br />
теги между абзацами, и могут быть некоторые из каждого вида в одном абзаце.
Я также не уверен в <br />
- тег, от того, что я видел, это может быть <br />
, <br/>
или <br>
.
Я искал аналогичный ответ, но из всех ответов, которые я видел, все они, похоже, предназначены только для одного из этих случаев, а не для всех сразу. Я думаю, в простых терминах, что я спрашиваю, есть ли регулярное выражение, которое я могу использовать для удаления всех <p>
теги из некоторого HTML, в которых нет буквенно-цифрового текста или символов/знаков препинания?
2 ответов
Ну, в конфликте с моим предложением не разбирать HTML с regexes, я написал регулярное выражение, чтобы сделать именно это:
"#<p>(\s| |</?\s?br\s?/?>)*</?p>#"
Это будет соответствовать должным образом для:
<p></p>
<p> </p> <!-- ([space]) -->
<p> </p> <!-- (That's a [tab] character in there -->
<p> </p>
<p><br /></p>
<p>
</p>
<p>
<br /><br />
</p>
принцип действия:
# / --> Regex start
# <p> --> match the opening <p> tag
# ( --> group open.
# \s --> match any whitespace character (newline, space, tab)
# | --> or
# --> match
# | --> 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| |</?\s?br\s?/?>)*</?p>#