Regexp匹配除了评论

时间:2016-09-02 14:50:25

标签: php regex perl

我试图找到所有出现的代码,除非该代码前面有注释。

这是我想要找到的一个例子:

$page_content .= '<meta http-equiv="refresh"

$page_content .= 'Some other text here</p><meta http-equiv="refresh"

有或没有前面的空格。 这就是我想要忽略的内容

//$page_content .= '<meta http-equiv="refresh"

再次使用或不使用前面的空格。

这样我可以确定我的代码库从不包含此代码,除非它在评论中或设置自动警报,如果找到它而没有得到错误警报,当它被注释掉时(忽略多行)现在评论。)

我尝试过使用后面的

(?<!\/\/).*<meta http-equiv="refresh"

但我没有太多运气,因为这仍然匹配每次出现,评论与否。

还有一件事:如果它在一个正则表达式而不是代码循环中会很棒,这样我就可以在Notepad ++或其他支持reg exp搜索的编辑器中进行搜索。 (令人惊讶的是,一个问题的阅读/理解有多么不同。我认为我很清楚,但从各种完全有效的答案中可以清楚地知道我可以包含更多细节: - )< / p>

2 个答案:

答案 0 :(得分:0)

在检查字符串

之前删除注释
while ( <$fh> ) {

    s|//.*||;

    if ( /<meta http-equiv="refresh"/ ) {
        ...;
    }
}

答案 1 :(得分:-1)

对于有问题的输入:

//$page_content .= '<meta http-equiv="refresh"

这将做的事情:

use strict;

use warnings;


open my $fh, "<", "my_path\\data.txt";

while ( my $line = <$fh>) {
    if ( $line =~ /^(?!\/\/).*?<meta http-equiv=\"refresh\"/){
        print $line;
    }
}

如果您有更多空格或其他缩进运算符,请使用look-behind运算符:     使用严格;

use warnings;


open my $fh, "<", "c:\\users\\uidp7702\\desktop\\data.txt";

while ( my $line = <$fh>) {
    if ( $line =~ /(?<!\/\/)\$page_content\s.=\s\'.*?<meta http-equiv=\"refresh\"/){
        print $line;
    }
}