关于php函数preg_replace的问题

时间:2009-10-15 11:27:20

标签: php html preg-replace

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

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

5 个答案:

答案 0 :(得分:5)

轻松的家伙。

要使用Ungreedy regexpr,请使用U修饰符 要使其成为多线,请使用s修饰符。 知道这一点,删除所有的paragraphes使用这种模式:

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

解释:

  • 我使用#delimiter来保护我的\字符(具有更易读的模式)
  • <p[^>]*>:检测开头段落(具有假设风格,如)
  • (.*)?:一切(以“Ungreedy模式”)
  • </p>:显然是结束段落

希望有所帮助!

答案 1 :(得分:2)

我建议不要用正则表达式来做这件事。更安全的方法是使用类似

的方法

Simple HTML DOM

以下是API参考的链接:Simple HTML DOM API Reference

另一种选择是使用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();
?>

答案 2 :(得分:2)

如果您尝试清理数据,通常建议您使用白名单,而不是将某些字词和标记列入黑名单。这更容易消毒并防止XSS攻击。有一个名为HTML Purifier的着名图书馆虽然规模较大且有些缓慢,却在净化数据方面取得了惊人的成果。

答案 3 :(得分:2)

如果您不知道标签之间的内容,Phill的回复将无效。

如果中间没有其他标签,这将有效,绝对是更容易的情况。你可以用你需要的任何标签替换div。显然。

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

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

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

这些未经过测试

答案 4 :(得分:1)

PSEUDO CODE

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 After

<div>I'm next</div>

我知道这是一项黑客工作