Intereting Posts

Как я могу использовать php для удаления тегов с пустым текстовым узлом?

Как я могу использовать php для удаления тегов с пустым текстовым узлом?

Например,

<div class="box"></div> удалить

<a href="#"></a> удалить

<p><a href="#"></a></p> удалить

<span style="..."></span> удалить

Но я хочу сохранить тег с текстовым узлом, как это,

<a href="#">link</a> сохранить

Редактировать:

Я тоже хочу удалить что-то грязное,

 <p><strong><a href="http://xx.org.uk/dartmoor-arts"></a></strong></p> <p><strong><a href="http://xx.org.uk/depw"></a></strong></p> <p><strong><a href="http://xx.org.uk/devon-guild-of-craftsmen"></a></strong></p> 

Я тестировал оба регулярных выражения ниже,

 $content = preg_replace('!<(.*?)[^>]*>\s*</\1>!','',$content); $content = preg_replace('%<(.*?)[^>]*>\\s*</\\1>%', '', $content); 

Но они оставляют что-то вроде этого,

 <p><strong></strong></p> <p><strong></strong></p> <p><strong></strong></p> 

Одним из способов может быть:

 $dom = new DOMDocument(); $dom->loadHtml( '<p><strong><a href="http://xx.org.uk/dartmoor-arts">test</a></strong></p> <p><strong><a href="http://xx.org.uk/depw"></a></strong></p> <p><strong><a href="http://xx.org.uk/devon-guild-of-craftsmen"></a></strong></p>' ); $xpath = new DOMXPath($dom); while(($nodeList = $xpath->query('//*[not(text()) and not(node())]')) && $nodeList->length > 0) { foreach ($nodeList as $node) { $node->parentNode->removeChild($node); } } echo $dom->saveHtml(); 

Возможно, вам придется немного изменить это для ваших нужд.

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

 // start buffering output ob_start(); // do some output echo '<div id="non-empty">I am not empty</div><a class="empty"></a>'; // at this point you want to output the contents to the client $contents = ob_get_contents(); // end buffering and flush ob_end_flush(); // replace empty html tags $contents = preg_replace('%<(.*?)[^>]*>\\s*</\\1>%', '', $contents); // echo the sanitized contents echo $contents; 

Позвольте мне знать, если это помогает 🙂

Вы могли бы заменить регулярное выражение так: $ updated = ""; while ($ updated! = $ original) {$ updated = $ original; $ original = preg_replace ('! <(. ?) [^>] > \ s *!', '', $ updated); }

Поместите его в цикл while, чтобы исправить это.