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

1つの方法は次のとおりです。

$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 に答える