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