php
  • regex
  • 2010-11-09 186 views 0 likes 
    0

    我正在尝试处理一些PHP代码以从特定数组中提取键。我使用正则表达式来做到这一点。正则表达式包含问题

    样本原文:

    $src = 'if ($loc["key"] == $val) { // some stuff }'; 
    

    正则表达式代码:

    preg_match_all('/\$loc\[\"(.+)\"]/',$src,$keys); 
    

    这给了我正确的答案:

    key 
    

    如果变化src到:

    $src = 'if ($loc["key"] == $val) { $loc["otherkey"] == $val; }'; 
    

    它提供:

    key"] == $val) { $loc["otherkey 
    

    没有人有任何想法,为什么是这样的,以及如何解决这个问题?

    回答

    1

    你需要做点ungreedy通过将“U”你的表情:

    preg_match_all('/\$loc\[\"(.+)\"]/U',$src,$keys); 
    

    或使用“但没有引述”表达式替换点:

    preg_match_all('/\$loc\[\"([^"]+)\"]/',$src,$keys); 
    
    +0

    非常感谢你,我不知道正则表达式的“贪婪”目的。第二种解决方案也很优雅:-) – Antoine 2010-11-09 11:28:42

    1

    +non-greedy(lazy)

    /\$loc\["(.+?)"\]/ 
    

    否则,它会尝试,直到找到另一"(最后一个)来匹配尽可能多的字符可能(.+)

    或者,也许更好的是,以匹配所有字符除了双引号:

    /\$loc\["([^"]+)"\]/ 
    

    顺便说一句,因为你使用的表达单引号,你不需要逃脱双引号。

    相关问题