需要正则表达式格式设置帮助


Regular Expression formatting help required

我正在尝试使用 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 标签的内容每次都会不同,因此.*?(我认为这是错误的(。

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

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

则表达式的.*?部分正在被转义。 因此,它与任何内容都不匹配。 试试这个。

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

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

"如何编辑/删除页脚中的Powered by MediaWiki图像?">

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

尝试类似操作:

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

现在,困难的问题是是否要让这个正则表达式"贪婪"。现在,它是不贪婪的,这意味着如果您尝试删除的页面中有另一个<li>,它将破坏您的页面。但是,如果您将其设置为贪婪,它将删除从 <li> 标记的开头到页面中最后一个 <li> 元素末尾的所有内容,即使它是不同的 <li> 元素也是如此。两者都不理想。这就是为什么一个合适的HTML解析器通常在操作HTML方面做得更好。

但是,如果页面足够简单,则正则表达式将起作用。

编辑 由于@Nilpo,纠正了一个严重的错误。