需要正则表达式格式化帮助

时间:2012-03-29 19:23:36

标签: php regex preg-replace mediawiki

我正在尝试使用preg_replace()动态删除部分文档。

/* target example:
        <li id="footer-poweredbyico">
        <img src="//bits.wikimedia.org/skins-1.18/common/images/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" width="88" height="31" />
        </li>
    */

$reg = preg_quote('<li id="footer-poweredbyico">.*?</li>');

preg_replace($reg,"",$str);

忽略PHP中的任何错误,这个问题是关于如何正确格式化正则表达式以删除与目标示例开始和结束标记匹配的任何内容。每次包含HTML标记的内容都不同,因此.*?(我认为这是错误的)。

4 个答案:

答案 0 :(得分:4)

The preg_quote function实际上与您想要的相反:其目的是禁用字符串中的所有正则表达式功能。因此,在您的情况下,您目前所拥有的(大致)是在HTML中寻找实际的.*?,而不是寻找零个或多个字符。你想要的是:

$str = preg_replace('/<li id="footer-poweredbyico">.*?<\/li>/s', '', $str);

答案 1 :(得分:2)

preg_quote()会停用您使用的所有特殊字符,例如.*?

尝试类似:

preg_replace('#<li id="footer-poweredbyico">.*?</li>#s', '', $str);

现在,困难的问题是这个正则表达式是否“贪婪”。现在,它是不合适的,这意味着如果你想要移除的那个内部有另一个<li>,它将会破坏你的页面。但是,如果你贪婪,那么它会删除从<li>标记开头到页面中最后一个<li>元素结尾的所有内容,即使它是一个不同的<li>元素。两者都不理想。这就是a proper HTML parser通常在操作HTML方面做得更好的原因。

但是如果页面足够简单,那么正则表达式就可以工作。

编辑通过@Nilpo修正了严重错误。

答案 2 :(得分:2)

你不需要使用这种黑客方法,阅读常见问题

"How can I edit / remove the Powered by MediaWiki image in the footer?"

答案 3 :(得分:2)

您的正则表达式的.*?部分正在转义。因此,它不匹配任何东西。试试这个。

$reg = preg_quote('<li id="footer-poweredbyico">') . '.*?' . preg_quote('</li>'); 

preg_replace($reg,"",$str);