Как удалить пустые теги абзаца из строки?

Я столкнулся с небольшой проблемой кодирования с шаблоном WordPress. Это код, который я использую в шаблоне:

<?php echo teaser(40); ?> 

В моих функциях я использую это, чтобы стричь теги и получать контент только из разрешенных тегов.

 <?php function teaser($limit) { $content = explode(' ', get_the_content(), $limit); if (count($content)>=$limit) { array_pop($content); $content = implode(" ",$content).'...'; } else { $content = implode(" ",$content); } $content = preg_replace('/\[.+\]/','', $content); $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]&gt;', $content); $content = strip_tags($content, '<p><a><ul><li><i><em><strong>'); return $content; } ?> 

Проблема: я использую приведенный выше код для разметки тегов из содержимого, но WordPress уже помещает теги изображений в абзац. Таким образом, результат – это теги абзаца, где изображения удаляются.

Просто ради очистки моего кода и бесполезных пустых тегов. Мой вопрос заключается в том, как удалить пустые теги абзаца?

 <p></p> 

Заранее большое спасибо! 🙂

Solutions Collecting From Web of "Как удалить пустые теги абзаца из строки?"

используйте это регулярное выражение для удаления пустого абзаца

 /<p[^>]*><\\/p[^>]*>/ 

пример

 <?php $html = "abc<p></p><p>dd</p><b>non-empty</b>"; $pattern = "/<p[^>]*><\\/p[^>]*>/"; //$pattern = "/<[^\/>]*>([\s]?)*<\/[^>]*>/"; use this pattern to remove any empty tag echo preg_replace($pattern, '', $html); // output //abc<p>dd</p><b>non-empty</b> ?> 

Это избавляет от всех пустых тэгов, даже если они содержат spaces или &nbps; внутри.

 $str = "<p> </p><p> &nbsp; </p><p>&nbsp</p><p>Sample Text</p>"; echo preg_replace("/<p[^>]*>[\s|&nbsp;]*<\/p>/", '', $str); 

Это только отголоски <p>Sample Text</p>

Используйте str_replace для удаления пустых тегов <p></p> .

 $content = str_replace("<p></p>","",$content); 

Все более продвинутые будут нуждаться в регулярных выражениях.

 $content = preg_replace('/<p[^>]*?></p>/', $content); 

Обновление: должно быть:

 $content = preg_replace('/<p [^>]*></p>/', $content); 

Эта функция удаляет пустые элементы, а затем другие пустые элементы, созданные из предыдущих удаленных элементов. (Строка примера содержит пробелы, вкладки и возврат каретки).

 function teaser( $html ) { $html = str_replace( '&nbsp;', ' ', $html ); do { $tmp = $html; $html = preg_replace( '#<([^ >]+)[^>]*>[[:space:]]*</\1>#', '', $html ); } while ( $html !== $tmp ); return $html; } 

Имея следующий пример:

 <?php $html = ' <p>Hello! <div class="foo"> <p id="nobody"> <span src="ok">&nbsp;</span> </p> </div> </p> '; echo teaser( $html ); ?> 

Функция возвращает:

 <p>Hello! </p> 

Удалите <p> из вашего вызова strip_tags. Второй аргумент перечисляет допустимые теги (которые не удаляются).

 $content = strip_tags($content, '<a><ul><li><i><em><strong>'); 

Вы пробовали решение CSS3?

 p:empty {display: none;}