【问题标题】:Regular Expression formatting help required需要正则表达式格式化帮助
【发布时间】:2012-03-29 19:23:36
【问题描述】:

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

【问题讨论】:

  • @Robbie 假设他不需要未来的灵活性,并且他愿意接受这将要放置的相当严格的约束,正则表达式可能是这项工作的正确工具。有时,在我看来,一个完整的 HTML 解析实际上 过大了。
  • 现在,无论您是否想混淆解析和匹配...您的正则表达式缺少分隔符、/s 修饰符,并且在所需的元字符上盲目应用 preg_quote 是这里的实际错误。

标签: php regex preg-replace mediawiki


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您不需要使用这种 hack 方法,请阅读常见问题解答

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

      【讨论】:

      • 完全不正确,我正在尝试做一些完全不同的事情,媒体 wiki 示例就是这样 - 一个示例
      • 使用 CSS 隐藏元素并将其从页面输出中完全删除是两种完全不同的野兽。
      【解决方案4】:

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

      尝试类似:

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

      现在,难题是是否让这个正则表达式“贪婪”。现在,它是不贪婪的,这意味着如果您要删除的页面中还有另一个&lt;li&gt;,它将破坏您的页面。但是如果你让它变得贪婪,它会删除从&lt;li&gt;标签开始到页面中最后一个&lt;li&gt;元素结束的所有内容,即使它是一个不同的&lt;li&gt;元素。两者都不理想。这就是为什么a proper HTML parser 通常在处理 HTML 方面做得更好。

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

      编辑纠正了一个严重错误,感谢@Nilpo。

      【讨论】:

      • 那个“复杂的序列”让它不贪婪的原因。如果您不知道自己在说什么,请不要提供居高临下的答案。
      • @Nilpo 感谢您指出我在那里缺乏知识,但是是什么让您认为我的评论居高临下?你自己的评论呢?
      • 有时很难以书面形式说出某人的语气。如果我误读了你,我深表歉意。
      猜你喜欢
      • 2012-11-30
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多