我試圖在分隔符後用PHP和preg_match得到一行字符串結束。這是我的代碼:在分隔符後面獲取字符串到行尾
<?php
$stringa = <<<EOT
var1=Ciao
var2=Variabile
var3=We
EOT;
preg_match("#var2=(.*?)\n#", $stringa, $boh);
print_r($boh);
?>
這個作品,但不是最後一行,如果我在正則表達式替換VAR2與VAR3生成的數組將爲空。
我試圖在分隔符後用PHP和preg_match得到一行字符串結束。這是我的代碼:在分隔符後面獲取字符串到行尾
<?php
$stringa = <<<EOT
var1=Ciao
var2=Variabile
var3=We
EOT;
preg_match("#var2=(.*?)\n#", $stringa, $boh);
print_r($boh);
?>
這個作品,但不是最後一行,如果我在正則表達式替換VAR2與VAR3生成的數組將爲空。
使用交替:
#var2=(.*?)(\n|$)#
^^^^
+1,尼斯干淨的解決方案。 – naththedeveloper
謝謝,在我用這個版本之前,用[\ n | $]代替(\ n | $),我的不好! – Grork
的原因是,你需要一個換行符後的 「我們」,以正確地匹配:
<?php
$stringa = <<<EOT
var1=Ciao
var2=Variabile
var3=We
EOT;
preg_match("#var3=(.*?)\n#", $stringa, $boh);
print_r($boh);
?>
因爲「EOT」出現在下面的行中,所以在「We」之後是否已經存在'\ n'?你是說,如果在最後有兩個連續的'\ n's,正則表達式纔會起作用? –
用於將EOT放在單獨行上的換行符不會將其放入字符串中。 –
啊,謝謝。我想這是有道理的,因爲如果沒有換行結束,沒有辦法終止字符串。 –
使用多行模式下,m
改性劑,以便$
匹配換行符或字符串的結尾:
preg_match('#var2=(.*?)$#m', $stringa, $boh);
而不是使用點,你可以使用[^\n]
是排除所有換行符:(。*?)?
preg_match('~(?<=var3=)[^\n]+~', $stringa, $boh);
有人能解釋'問號的語義'我知道''意思是「可選」,如'{0,1}'或'(xxx |)'中所示,但是我從來沒有在'*'後面看到它。它是否適用於'。*'的整個表達式?如果是這樣,是不是多餘的,因爲'*'可以匹配0次? –
@PeterAlfvin - '?'可以跟隨任何量詞來量化_non-greedy_。 (可以查找術語。)簡而言之,它指示量詞匹配_儘可能少的實例_(而不是_as儘可能多的實例,這是默認行爲)。例如,'*?','+?','??','{2,5}?',都是相應量詞的非貪婪版本。 –
@ acheong87 - 謝謝! –