评论已经找到了问题的根源:通过使用问号表示您的匹配是惰性的(与默认的贪婪相反),它进行了最小匹配,在这种情况下......什么都没有。
考虑:
$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);