脱掉<p>还是更好的东西?

时间:2013-05-02 作者:markb

正在寻找一些帮助,我真的在考虑暂时不使用blockquotes!

我有以下代码:

<?php
    $show_after_p = 1; $content = apply_filters( \'the_content\', get_the_content() );
    if(substr_count($content, \'<p>\') > $show_after_p) {
        $contents = explode(\'<p>\', $content); $p_count = 1;
        foreach($contents as $content) {
            $content = str_replace(\'</p>\', \'\', $content);
            echo wpautop($content);
            if($p_count == $show_after_p) { get_template_part(\'_templates/box\'); } $p_count++;
        }
    }
?>
wpautop的原因是修复内容中的一个短代码,以及在第一个框之前插入框的方式<p> 而不是之后。无论如何,由于该框是在第一个之前添加的<p> 标记,在块引号中插入:

<blockquote>
    <!-- The inserted box -->
    <p>The quote</p>
</blockquote>
所以我在寻找一种方法<p><blockquote> (我意识到它在语义上不正确,但互联网必须用它来治愈!)或者更好的。。

此外,我还添加了functions 标记,以防有人将其转换为函数,因为我有多个帖子类型,这将适用于:]

2 个回复
SO网友:onetrickpony

使用正则表达式操纵HTML不是一个好主意。我建议您使用DOMDocument:

// input
$html = apply_filters(\'the_content\', get_the_content());

$dom = new \\DomDocument();
$dom->loadHtml($html);

$blockquotes = $dom->getElementsByTagName(\'blockquote\');
foreach($blockquotes as $blockquote){
  foreach($blockquote->childNodes as $e){
    if($e->nodeName === \'p\'){
      // create a text node with the contents of the <p>
      $blockquote->insertBefore($dom->createTextNode($e->textContent), $e);

      // remove <p>
      $blockquote->removeChild($e);
    }
  }
} 

// remove doctype
$dom->removeChild($dom->firstChild);            
$dom->replaceChild($dom->firstChild->firstChild->firstChild, $dom->firstChild);  

print $dom->saveHtml();

SO网友:Santoro

也许可以使用一个简单的preg\\u replace,但在本例中必须删除P周围的空格

$结果=preg\\u replace(\'<;p[^>]>(?:\\s+)(?: ;)+|(?:)+)\',\'\',$内容);

如果您不想在blockquote中使用任何标记,可以使用maube strip_tags($content); 删除所有html标记

结束