Как я могу использовать 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, чтобы исправить это.