2013-08-27 40 views
2

您好我有下面的代碼比賽結束工作不

www.dafont.com FALSE / FALSE 0 PHPSESSID 5sce9gsn1ltj74brc02ls6gsg2 
.dafont.com TRUE / FALSE 1409175984 msid MC222 

我需要得到5sce9gsn1ltj74brc02ls6gsg2mc22。我想下面的代碼,但它不工作

preg_match('/PHPSESSID (.*?)/',$getit,$session); 
preg_match('/msid (.*?)/',$getit,$msid); 
+0

它怎麼不起作用? –

+0

var_dump($ session)爲空 –

+4

用'。*'替換'。*?'。 –

回答

4

的意見已經得到了問題的根源:使用問號,以表明你的對手是懶惰的(而不是貪婪的默認設置),它使一個最小匹配,這是,在這種情況下......什麼都不是。

考慮:

$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); 
1

我會怎麼做:

preg_match('/PHPSESSID\s+(\S+)/', $getit, $session); 
preg_match('/msid\s+(\S+)/', $getit, $msid); 

\S代表字符不是空格。