php
  • regex
  • 2010-11-09 187 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\["([^"]+)"\]/ 
    

    順便說一句,因爲你使用的表達單引號,你不需要逃脫雙引號。

    相關問題