嗨,我有以下代码
www.dafont.com FALSE / FALSE 0 PHPSESSID 5sce9gsn1ltj74brc02ls6gsg2
.dafont.com TRUE / FALSE 1409175984 msid MC222
我需要5sce9gsn1ltj74brc02ls6gsg2
和mc22
。我尝试了下面的代码,但它没有工作
preg_match('/PHPSESSID (.*?)/',$getit,$session);
preg_match('/msid (.*?)/',$getit,$msid);
答案 0 :(得分: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>/
将正确匹配“第一段”和“第二段”。
现在,关于你的问题的说明。如果你想要匹配你知道将在你的字符串末尾的东西,那么“字符串结束”元字符($
)就是你的朋友。此外,作为一般安全事项,预测输入中可能存在多个空白字符并不是一个坏主意。所以我会这样修改你的代码:
preg_match('/PHPSESSID\s+(.*?)\s*$/',$getit,$session);
preg_match('/msid\s+(.*?)\s*$/',$getit,$msid);
答案 1 :(得分:1)
我会这样做:
preg_match('/PHPSESSID\s+(\S+)/', $getit, $session);
preg_match('/msid\s+(\S+)/', $getit, $msid);
\S
代表不是空格的字符。