14

我有一个带有一些配置值的文本文件。有一条以#开头的注释我正在尝试找到一个正则表达式模式,它将找出所有以#开头的行

因此,示例文件:

1st line
#test line this 
line #new line
aaaa #aaaa
bbbbbbbbbbb#
cccccccccccc
#ddddddddd

我想找到

#test line this 
#ddddddddd

因为只有这两行以 # 开头,所以我尝试了以下代码:

preg_match_all("/^#(.*)$/siU",$text,$m);
var_dump($m);

但它总是输出空数组。任何人都可以帮忙吗?

4

2 回答 2

21

您忘记了多行修饰符(并且您不应该使用单行修饰符;不区分大小写的修饰符以及不贪婪的修饰符也是不必要的):

preg_match_all("/^#(.*)$/m",$text,$m);

解释:

  • /m允许^and$在行的开头/结尾匹配,而不仅仅是整个字符串(你需要在这里)
  • /s允许点匹配换行符(你不想在这里)
  • /i打开不区分大小写的匹配(这里不需要)
  • /U打开不贪婪的匹配(由于锚点,这里没有区别)

PHP 代码演示:

$text = "1st line\n#test line this \nline #new line\naaaa #aaaa\nbbbbbbbbbbb#\ncccccccccccc\n#ddddddddd"; 
preg_match_all("/^#(.*)$/m",$text,$m);
print_r($m[0]);

结果:

[0] => #test line this 
[1] => #ddddddddd
于 2013-08-03T16:44:33.313 回答
2

你可以简单地写:

preg_match_all('~^#.*~m', $text, $m);

因为量词默认是贪婪的,并且点默认不匹配换行符,所以你会得到你想要的。

于 2013-08-03T16:46:37.830 回答