从正则表达式更改代码

时间:2016-06-02 20:41:25

标签: php html regex wordpress

我有以下2套代码(Wordpress)使用正则表达式,但我被告知这是一个不好的做法。
我以两种方式使用它:

  1. 从帖子中找出块引用和图像,只显示文本。
  2. 基本上相反,只显示图像。
  3. 希望以适当的更可接受/跨浏览器形式编写它。

    html(显示文字):

    <?php
    $content = preg_replace('/<blockquote>(.*?)<\/blockquote>/', '', get_the_content());
    $content = preg_replace('/(<img [^>]*>)/', '', $content);
    $content = wpautop($content); // Add paragraph-tags
    $content = str_replace('<p></p>', '', $content); // remove empty paragraphs
    echo $content;
    ?>  
    

    html(显示图片):

    <?php
    preg_match_all('/(<img [^>]*>)/', get_the_content(), $images);
    for( $i=0; isset($images[1]) && $i < count($images[1]); $i++ ) {
        if ($i == end(array_keys($images[1]))) {
            echo sprintf('<div id="last-img">%s</div>', $images[1][$i]);
            continue;
        }
        echo $images[1][$i];
    }
    ?>
    

1 个答案:

答案 0 :(得分:0)

您可以使用此处的答案:Strip Tags and everything in between

重点是使用解析器,而不是自己动手制作可能有错误的正则表达式。

$content = get_the_content();
$content = wpautop($content);

$doc = new DOMDocument();
$doc->loadHTML(get_the_content(), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$xpath = new DOMXPath($doc);

foreach ($xpath->query('//blockquote') as $node) {
    $node->parentNode->removeChild($node);
}

foreach ($xpath->query('//img') as $node) {
    $node->parentNode->removeChild($node);
}

foreach( $xpath->query('//p[not(node())]') as $node ) {
    $node->parentNode->removeChild($node);
}

$content = $doc->saveHTML($doc);

您可能会发现php DOMDocument已将您的html片段包装在<html>个标签中,在这种情况下请查看How to saveHTML of DOMDocument without HTML wrapper?

删除空p代码的部分来自Remove empty tags from a XML with PHP