php - 是否可以在正则表达式中对两个单独的环视/零宽度断言(即lookbehind/look-behind)进行“与”操作?

标签 php regex concatenation pcre lookbehind

我使用 Perl 来解决这个正则表达式问题,但最好知道它是否也适用于 PHP。

我需要注释掉 PHP 文件中的所有 print 语句或所有以 print 开头的内容。它看起来像这样:

<?php
    // Description of file
    ...
    print("Foobar");
    // print("Foo");
    //print("bar");
    // Open and print file
    function printtemplate($file) {
    ...
    }
    ...
    printtemplate($file);
    ...  
?>

首先,我制定了一个如下的正则表达式:

((?<!function )|(?<!//))print

这显然不起作用,因为 | 是一个 OR。我正在寻找一个“与”,以便两个否定的后向断言都必须为真。 AND 结构是否以某种形式存在于正则表达式中,或者是否有办法模拟它?

最终,在应用正则表达式后,我希望 php 文件如下所示:

<?php
    // Description of file
    ...
    //print("Foobar");
    // print("Foo");
    //print("bar");
    // Open and print file
    function printtemplate($file) {
    ...
    }
    ...
    //printtemplate($file);
    ...  
?>

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

只需将它们放在一起即可。就是这样。它将创建“AND”效果,因为您需要先通过两个环视,然后才能匹配它们之后的任何内容。

就您而言,它将是:

(?<!function )(?<!//)print

但是,请注意,上面的正则表达式将返回误报,这会导致添加不必要的注释。 Demo .

对于 PCRE(在 PHP 中使用),后视断言要求模式严格固定长度,因此不可能使用后视断言在所有情况下检查是否print 被注释掉或不排除它。 @mpapec 的答案提供了一种适用于编写良好的代码的解决方案,并且比具有后向功能的正则表达式具有更好的覆盖范围。

关于php - 是否可以在正则表达式中对两个单独的环视/零宽度断言(即lookbehind/look-behind)进行“与”操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499782/

相关文章:

javascript - 正则表达式要求的格式

ruby-on-rails - Rails 和 Postgresql 连接空格

php - 如何使用更多内容正确添加标题位置?

javascript - 如果用户已在其他选项卡中连接到 facebook,则检索 facebook 用户照片

javascript - 有人可以帮我找到使用 javascript 的正则表达式吗

linux - 使用 ; 在 Lua 中连接问题

mysql - 如何使用 concat() 在单个 mysql 更新中追加到多个列

php - 带前导零的整数数组 - 奇怪的结果

php - 如何在MySQL存储过程中使用IN运算符?

javascript -/.*=/,'' 在 var id=this.href.replace(/.*=/,'' ); 中是什么意思?