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

Ahm*_*uad 27 php

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

<?php echo teaser(40); ?>
Run Code Online (Sandbox Code Playgroud)

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

<?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;
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

<p></p>
Run Code Online (Sandbox Code Playgroud)

非常感谢提前!:)

Pra*_*pta 46

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

/<p[^>]*><\\/p[^>]*>/
Run Code Online (Sandbox Code Playgroud)

<?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>
?>
Run Code Online (Sandbox Code Playgroud)

  • 另外,不要告诉他"正则表达式总是最好的做法",它肯定不是!在解析HTML时,正则表达式通常都很糟糕.这个特殊的例子很简单,正则表达式可以处理它,但你不应该推荐它作为一个通用的.在这里使用正则表达式的*真正的原因是它更灵活..它将剥离具有属性的`p`标签. (8认同)
  • 每个人都做这个"除了"之外的方法,而且我从来不明白为什么......基本上你要做的就是匹配*所有*直到下一个`>`,即一个*ungreedy*搜索......所以为什么不做它不合适并保持可读性?`<p(\ s.*?)?>`或者我忽略了什么问题?ps:你的东西匹配`<pooptag> </ poopface>`.我也不明白为什么人们如此坚持使用`/`作为开始/结束角色然后强迫自己逃脱它们为什么?为什么?!?!在你的模式中使用一个怪异的反引号或*不是*的字符. (3认同)

bla*_*9ue 30

这将删除所有空p标记,即使它们包含spaces&nbps;内部.

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

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

这只是回音 <p>Sample Text</p>

  • 这将无法正常工作,因为`[]`在正则表达式中起作用,它甚至会匹配像`<p> ps这样的段落; spnnnn pppp bbb&bs; </ p>`这肯定不是空的.它可以固定为`/ <p [^>]*>([\ s] |&nbsp;)*<\/p> /`虽然 (2认同)

Ale*_*elo 5

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

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

    return $html;
}
Run Code Online (Sandbox Code Playgroud)

有以下示例:

<?php

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

echo teaser( $html );

?>
Run Code Online (Sandbox Code Playgroud)

该函数返回:

<p>Hello!

</p>
Run Code Online (Sandbox Code Playgroud)