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);
4

2 回答 2

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);
于 2013-08-27T22:09:18.977 回答
1

我会做:

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

where\S代表不是空格的字符。

于 2013-08-28T08:21:53.970 回答