4

我想从 html 文件中动态删除特定标签及其内容,并考虑使用 preg_replace 但无法获得正确的语法。基本上它应该,例如,做类似的事情:用什么都替换(包括)“”之间的所有内容。

有人可以帮我解决这个问题吗?

4

5 回答 5

5

轻松的家伙。

要使用 Ungreedy 正则表达式,请使用 U 修饰符;要使其成为多行,请使用 s 修饰符。知道,要删除所有段落,请使用以下模式:

#<p[^>]*>(.*)?</p>#sU

解释 :

  • 我使用 # 分隔符不必保护我的 \ 字符(以获得更易读的模式)
  • <p[^>]*>: 检测开头段落的部分(带有假设风格,例如 )
  • (.*)?:一切(在“不贪婪模式”中)
  • </p>: 很明显,最后一段

希望有帮助!

于 2009-10-15T14:03:40.073 回答
2

我建议不要尝试使用正则表达式来执行此操作。更安全的方法是使用类似的东西

简单的 HTML DOM

这是 API 参考的链接: 简单的 HTML DOM API 参考

另一种选择是使用DOMDocument

这里的想法是使用真正的 HTML 解析器来解析数据,然后您可以移动/遍历树并删除您需要的任何元素/属性/文本。与尝试使用正则表达式替换 HTML 中的数据相比,这是一种更简洁的方法。

<?php
    $doc = new DOMDocument;
    $doc->loadHTMLFile('blah.html');

    $content       = $doc->documentElement;
    $table         = $content->getElementsByTagName('table')->item(0);
    $delfirstTable = $content->removeChild($table);

    echo $doc->saveHTML();
?>
于 2009-10-15T11:37:11.117 回答
2

如果您不知道标签之间的内容,Phill 的响应将不起作用。

如果两者之间没有其他标签,这将起作用,并且绝对是更简单的情况。显然,您可以用您需要的任何标签替换 div。

preg_replace('#<div>[^<]+</div>#','',$html);

如果中间可能有其他标签,这应该可以工作,但可能会导致问题。如果是这样,您可能最好使用上面的 DOM 解决方案

preg_replace('#<div>.+</div>#','',$html);

这些未经测试

于 2009-10-15T13:00:41.237 回答
2

如果您尝试清理数据,通常建议您使用白名单,而不是将某些术语和标签列入黑名单。这更容易清理和防止 XSS 攻击。有一个名为HTML Purifier的著名库,虽然它很大而且速度有些慢,但在净化数据方面有惊人的效果。

于 2009-10-15T11:44:36.250 回答
1

伪代码

function replaceMe($html_you_want_to_replace,$html_dom) {
   return preg_replace(/^$html_you_want_to_replace/, '', $html_dom);
}

之前的 HTML

<div>I'm Here</div><div>I'm next</div>

<?php
$html_dom = "<div>I'm Here</div><div>I'm next</div>";
$get_rid_of = "<div>I'm Here</div>";
replaceMe($get_rid_of);
?>

HTML 之后

<div>I'm next</div>

我知道这是一个黑客工作

于 2009-10-15T12:55:39.420 回答