2012-08-09 27 views
1

我想从xml文件中过滤一个用户名。该xml文件看起来像<player id="123456" name="somename" alliance="123"/>。现在我尝试了以下正则表达式:preg_match("/name=\"(.*)\"/")。但不知何故,尽管我已将\"放在明星符号后面,但似乎我的正则表达式不会在第一个"处停止,而是在第三个位置。这是我得到的:somename" alliance="123 这是什么原因?为什么我的正则表达式代码跳过第一个引号?

+1

可能会更好用一个XML解析器,而不是正则表达式。 – kapa 2012-08-09 23:33:23

回答

4

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

看看regex reference page上的“懒惰而不是贪婪”一节。

1

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

使用?停止,像这样:

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

或者干脆从接受报价阻止它作为名称的一部分,就像这样:

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