匹配行尾无法正常工作

时间:2013-08-27 21:51:39

标签: php regex preg-match

嗨,我有以下代码

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

2 个答案:

答案 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代表不是空格的字符。