开发者

How to remove empty paragraph tags from string?

I ran into a slight coding problem with WordPress template. This is the code I use in template:

<?php echo teaser(40); ?>

In my functions, I use this to strip tags and get content from allowed tags only.

<?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;
}
?>

The problem: I use the above code to strip tags from the content, but WordPress already puts image tags within paragraph. So the result is empty paragraph tags where images are stripped.

Just for the sake of cleaning up my c开发者_StackOverflowode and useless empty tags. My question is how to remove empty paragraph tags?

<p></p>

Thanks a lot in advance! :)


use this regex to remove empty paragraph

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

example

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


This gets rid of all empty p tags, even if they contain spaces or &nbps; inside.

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

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

This only echoes <p>Sample Text</p>


This function remove empty elements and then, other empty elements, created from previous removed elements. (The example string contains spaces, tabs and carriage returns.)

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

    return $html;
}

Having the following example:

<?php

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

echo teaser( $html );

?>

The function returns:

<p>Hello!

</p>


Use str_replace to remove empty <p></p> tags.

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

Anything more advanced will need regular expressions.


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

Update: should be:

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


Remove the <p> tag from your strip_tags call. The second argument lists the acceptable tags (that don't get stripped).

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


Have you tried the CSS3 solution?

p:empty {display: none;}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜