Как я могу использовать php для удаления тегов с пустым текстовым узлом? - PullRequest
0 голосов
/ 23 июля 2011

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

Например,

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

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

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

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

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

<a href="#">link</a> keep

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

Я тоже хочу удалить что-то вроде этого,

<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>

Ответы [ 3 ]

3 голосов
/ 23 июля 2011

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

$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();

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

0 голосов
/ 23 июля 2011

Вы должны буферизовать вывод 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;

Дайте мне знать, если это поможет:)

0 голосов
/ 23 июля 2011

Вы можете заменить регулярное выражение, например:

$updated="";
while($updated != $original) {
    $updated = $original;
    $original = preg_replace('!<(.*?)[^>]*>\s*</\1>!','',$updated);
}

Помещение в цикл while должно исправить это.

...