到目前为止,我已经阅读并试图在大约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无法呈现给浏览器 - 它只需要将代码返回到父模板标签和内容已删除。
答案 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();
答案 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: "