2013-07-24 50 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);