1

到目前为止,我已经阅读并尝试针对堆栈溢出实施大约 10 种不同的解决方案的变体,但它们都没有工作。我要做的就是替换两个 pre 标签之间的内容(包括标签本身)。我不在乎它是正则表达式还是直接 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 无法呈现给浏览器 - 它只需将代码返回给父模板标签和内容被删除。

4

2 回答 2

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();

键盘示例

于 2012-09-28T19:13:23.187 回答
2

如果您使用断言(即前瞻/后瞻),正则表达式将正常工作。这应该删除 pre 标签中的任何内容:

$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: "
于 2012-09-28T19:15:06.743 回答