2013-07-24 63 views
3

我试图在分隔符后用PHP和preg_match得到一行字符串结束。这是我的代码:在分隔符后面获取字符串到行尾

<?php 
$stringa = <<<EOT 
var1=Ciao 
var2=Variabile 
var3=We 
EOT; 
preg_match("#var2=(.*?)\n#", $stringa, $boh); 
print_r($boh); 
?> 

这个作品,但不是最后一行,如果我在正则表达式替换VAR2VAR3生成的数组将为空。

+0

有人能解释'问号的语义'我知道''意思是“可选”,如'{0,1}'或'(xxx |)'中所示,但是我从来没有在'*'后面看到它。它是否适用于'。*'的整个表达式?如果是这样,是不是多余的,因为'*'可以匹配0次? –

+0

@PeterAlfvin - '?'可以跟随任何量词来量化_non-greedy_。 (可以查找术语。)简而言之,它指示量词匹配_尽可能少的实例_(而不是_as尽可能多的实例,这是默认行为)。例如,'*?','+?','??','{2,5}?',都是相应量词的非贪婪版本。 –

+0

@ acheong87 - 谢谢! –

回答

3

使用交替:

#var2=(.*?)(\n|$)# 
     ^^^^ 
+0

+1,尼斯干净的解决方案。 – naththedeveloper

+0

谢谢,在我用这个版本之前,用[\ n | $]代替(\ n | $),我的不好! – Grork

1

的原因是,你需要一个换行符后的 “我们”,以正确地匹配:

<?php 
$stringa = <<<EOT 
var1=Ciao 
var2=Variabile 
var3=We 

EOT; 
preg_match("#var3=(.*?)\n#", $stringa, $boh); 
print_r($boh); 
?> 
+0

因为“EOT”出现在下面的行中,所以在“We”之后是否已经存在'\ n'?你是说,如果在最后有两个连续的'\ n's,正则表达式才会起作用? –

+0

用于将EOT放在单独行上的换行符不会将其放入字符串中。 –

+0

啊,谢谢。我想这是有道理的,因为如果没有换行结束,没有办法终止字符串。 –

3

使用多行模式下,m改性剂,以便$匹配换行符或字符串的结尾:

preg_match('#var2=(.*?)$#m', $stringa, $boh); 
0

而不是使用点,你可以使用[^\n]是排除所有换行符:(。*?)?

preg_match('~(?<=var3=)[^\n]+~', $stringa, $boh);