为什么我的正则表达式代码跳过第一个引用?

时间:2012-08-09 23:28:02

标签: php regex

我想从xml文件中过滤用户名。 xml文件看起来像<player id="123456" name="somename" alliance="123"/>。现在我尝试了以下正则表达式:preg_match("/name=\"(.*)\"/")。但不知怎的,虽然我把\"放在了明星符号后面,看起来我的正则表达式并没有停留在第一个"而是停在第三个somename" alliance="123。这就是我得到的:{{1}} 这是什么原因?

3 个答案:

答案 0 :(得分:4)

.*是贪婪的,它会匹配尽可能多的字符,因此它不会在字符串中最后一个"之前停止。将其更改为.*?,它应该只匹配到下一个",因为?会使重复变得懒惰而不是贪婪。

看看regex reference page上的“懒惰而非贪婪”​​部分。

答案 1 :(得分:1)

它处于所谓的“贪婪”模式 - 它会尽可能多地匹配。

使用?来阻止它,如下所示:

/name=\"(.*?)\"/

或者只是阻止它接受引号作为名称的一部分,如下所示:

/name=\"([^\"]*)\"/

答案 2 :(得分:0)

$text ='<player id="123456" name="somename" alliance="123"/>';
if (preg_match("/name=\"([^\"]*)\"/", $text, $match))
{
    $name = $match[1];
}
相关问题