如何删除<pre> tags in PHP?</pre>之间的所有内容

时间:2012-09-28 18:59:59

标签: php regex html-parsing

到目前为止,我已经阅读并试图在大约10个不同的解决方案上实现对堆栈溢出的修改,并且它们都没有工作。我想要做的就是替换两个预标签之间的内容(包括标签本身)。我不在乎它是正则表达式还是直接的php。有人有什么建议吗?

一个例子是:

This is how to remove pre tags and their contents:<br/>

<pre>
<?php>
[code here]
<?php>

That's all there is to it.

变为:

This is how to remove pre tags and their contents:</br>
That's all there is to it.

这需要在html呈现给页面之前发生。

我不确定DOMDocument是否可行。我的代码的上下文是它发生在表达式引擎的插件中(基于codeigniter / php的CMS)。该插件将html截断为设置的字符长度,并将其呈现回父模板以在浏览器中呈现 - 因此domdocument无法呈现给浏览器 - 它只需要将代码返回到父模板标签和内容已删除。

2 个答案:

答案 0 :(得分:2)

使用DOMDocument

$html = '<div id="container">
    <div id="test"></div>
    <pre>
        content
    </pre>
</div>';

$dom = new DOMDocument;
$dom->loadXML($html);

$xpath = new DOMXPath($dom);
$query = '//div[@id="container"]/pre';
// $query = '//pre'; // for all <pre>
$entries = $xpath->query($query);

foreach($entries as $one){
    $newelement = $dom->createTextNode('Some new node!'); 
    $one->parentNode->replaceChild($newelement, $one);
}

echo $dom->saveHTML();

Codepad Example

答案 1 :(得分:2)

如果使用断言(即向前看/后看),正则表达式将正常工作。这应删除预标记内的任何内容:

$page_content = preg_replace('/<(pre)(?:(?!<\/\1).)*?<\/\1>/s','',$page_content);

如果要包含其他标记,只需将它们添加到初始匹配组中,如:

(pre|script|style)

删除正则表达式标记的唯一真正问题是相同类型的嵌套标记,例如:

<div>
    <div>inner closing tag might match beginning outer opening div tag leaving an orphan outer closing tag</div>
<div>

修改

我测试了你在另一个评论中留下的另一个答案的例子,对我来说很好:

$html = 'This is a quick snippet that often comes in handy: <pre>[code]blah blah[/code]</pre>';
$html = preg_replace('/<(pre)(?:(?!<\/?\1).)*?<\/\1>/s',"",$html);
var_dump($html);

结果:

string(51) "This is a quick snippet that often comes in handy: "