0

如何使用 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>
4

3 回答 3

3

一种方法可能是:

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

可能您必须根据需要对其进行一些更改。

于 2011-07-23T16:49:39.097 回答
0

你可以做一个正则表达式替换,如:

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

把它放在一个while循环中应该可以解决它。

于 2011-07-23T16:10:41.010 回答
0

您应该缓冲 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;

让我知道这是否有帮助:)

于 2011-07-23T16:18:18.227 回答