【问题标题】:How can I remove all content between <pre> tags in PHP?如何删除 PHP 中 <pre> 标记之间的所有内容?
【发布时间】:2012-09-28 18:59:58
【问题描述】:

到目前为止,我已经阅读并尝试针对堆栈溢出实施大约 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 无法呈现给浏览器 - 它只需将代码返回给父模板已删除标签和内容。

【问题讨论】:

标签: php regex html-parsing


【解决方案1】:

如果您使用断言(即前瞻/后瞻),Regex 将可以正常工作。这应该删除 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: "

【讨论】:

  • 这并没有为我删除任何内容。
  • 你的代码有结束标签吗?上面的例子似乎没有......这个正则表达式需要一个结束标签来匹配中间的所有内容,包括打开和结束标签。
  • 好的,我开始怀疑您的 pcre 或 php 设置是否有问题
【解决方案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

【讨论】:

  • 这看起来是一个很棒的方法,但我收到了这个警告:Message: DOMDocument::loadXML() [domdocument.loadxml]: Extra content at the end of the document in Entity, line: 4
  • 另外,它在一个文件中运行,该文件处理修改后的 html 内容本身的位置,所以我不想将替换内容呈现给 DOM。这还能用吗?
  • 只要$string是一个HTML字符串,它应该可以正常工作。
  • $string 我假设你的意思是 $html?我的 $html 变量看起来像这样:'This is a quick snippet that often comes in handy: &lt;pre&gt;[code]blah blah[/code]&lt;/pre&gt;
  • 抱歉,我得去个地方。您可以添加一个自定义标签来包装所有文本:codepad.org/MzVETYaq
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2014-02-17
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多