的意見已經得到了問題的根源:使用問號,以表明你的對手是懶惰的(而不是貪婪的默認設置),它使一個最小匹配,這是,在這種情況下......什麼都不是。
考慮:
$input = "foo bar";
preg_match('/foo (.*)/', $matches); // matches 'bar'
preg_match('/foo (.*?)/', $matches); // matches ''
唯一明智的使用懶惰量詞的東西如下它的時候。所以你可以使用這個:
preg_match('/foo (.*?)$/', $matches); // matches 'bar'
但它是沒有必要的。
爲了理解整個貪婪/懶惰的區別,下面介紹如何使用惰性匹配。假設您正在嘗試匹配HTML段落標記的內容。考慮:
input: '<p>paragraph one</p>'
regex: /<p>(.*)<\/p>/
這個按預期工作。但是,如果您有:
input: '<p>paragraph one</p><p>paragraph two</p>'
regex: /<p>(.*)<\/p>/
你將得到的結果:
'paragraph one</p></p>paragraph two'
這可能不是你想要的。這是因爲.*
是貪婪默認情況下:它匹配所有它可以。讓它懶惰:
/<p>(.*?)<\/p>/
將正確匹配'段落1'和'段落2'。
現在,關於您的問題的說明。如果你想匹配你知道將會出現在字符串末尾的東西,那麼「字符串結尾」元字符($
)就是你的朋友。另外,作爲一個普通的安全事物,預測輸入中可能有多個空白字符並不是一個壞主意。所以,我正是如此修改代碼:
preg_match('/PHPSESSID\s+(.*?)\s*$/',$getit,$session);
preg_match('/msid\s+(.*?)\s*$/',$getit,$msid);
它怎麼不起作用? –
var_dump($ session)爲空 –
用'。*'替換'。*?'。 –