如何从字符串中删除空段落标记?

时间:2010-09-28 01:40:21

标签: php

我遇到了WordPress模板的轻微编码问题。这是我在模板中使用的代码:

<?php echo teaser(40); ?>

在我的函数中,我使用它来剥离标记并仅从允许的标记中获取内容。

<?php
function teaser($limit) {
    $content = explode(' ', get_the_content(), $limit);
    if (count($content)>=$limit) {
    array_pop($content);
    $content = implode(" ",$content).'...';
    } else {
    $content = implode(" ",$content);
    }   
    $content = preg_replace('/\[.+\]/','', $content);
    $content = apply_filters('the_content', $content); 
    $content = str_replace(']]>', ']]&gt;', $content);
    $content = strip_tags($content, '<p><a><ul><li><i><em><strong>');
    return $content;
}
?>

问题:我使用上面的代码从内容中删除标签,但WordPress已将图像标签放在段落中。因此,结果是空段落标记,其中图像被剥离。

只是为了清理我的代码和无用的空标签。 我的问题是如何删除空段落标签?

<p></p>

提前多多感谢! :)

7 个答案:

答案 0 :(得分:43)

使用此正则表达式删除空段

/<p[^>]*><\\/p[^>]*>/

例如

<?php
$html = "abc<p></p><p>dd</p><b>non-empty</b>"; 
$pattern = "/<p[^>]*><\\/p[^>]*>/"; 
//$pattern = "/<[^\/>]*>([\s]?)*<\/[^>]*>/";  use this pattern to remove any empty tag

echo preg_replace($pattern, '', $html); 
// output
//abc<p>dd</p><b>non-empty</b>
?>

答案 1 :(得分:26)

即使它们内部包含pspaces,也会删除所有空&nbps;个标记。

$str = "<p>  </p><p> &nbsp; </p><p>&nbsp</p><p>Sample Text</p>";

echo preg_replace("/<p[^>]*>[\s|&nbsp;]*<\/p>/", '', $str);

这只会回应<p>Sample Text</p>

答案 2 :(得分:4)

此函数删除空元素,然后删除从先前删除的元素创建的其他空元素。 (示例字符串包含空格,制表符和回车符。)

function teaser( $html ) {
    $html = str_replace( '&nbsp;', ' ', $html );
    do {
        $tmp = $html;
        $html = preg_replace(
            '#<([^ >]+)[^>]*>[[:space:]]*</\1>#', '', $html );
    } while ( $html !== $tmp );

    return $html;
}

有以下例子:

<?php

    $html = '
    <p>Hello!
        <div class="foo">
            <p id="nobody">
                <span src="ok">&nbsp;</span>
            </p>
        </div>
    </p>
    ';

echo teaser( $html );

?>

该函数返回:

<p>Hello!

</p>

答案 3 :(得分:3)

使用str_replace删除空<p></p>标记。

$content = str_replace("<p></p>","",$content);

任何更高级的东西都需要正则表达式。

答案 4 :(得分:2)

$content = preg_replace('/<p[^>]*?></p>/', $content);

更新:应该是:

$content = preg_replace('/<p [^>]*></p>/', $content);

答案 5 :(得分:-7)

从strip_tags调用中删除<p>标记。第二个参数列出了可接受的标签(不会被剥离)。

$content = strip_tags($content, '<a><ul><li><i><em><strong>');

答案 6 :(得分:-8)

您是否尝试过CSS3解决方案?

p:empty {display: none;}