2015-02-24 101 views
1

我想掃描一個PHP文件的變量定義,例如$測試= 「1」;並同時返回變量名和值,這裏是我試過到目前爲止:正則表達式整個字符串匹配不是組件

preg_match_all('/\$(.*)="(.*)";/', $content, $out); 

這工作得很好,當我有很多在單獨的行定義的變量,例如:

$test1="1"; 
$test2="2"; 
$test3="3"; 

但當變量被一個接一個地定義時,那麼我的匹配只會返回一個巨大的字符串,例如

$test1="1";$test2="2";$test3="3"; 

我想這是因爲它被解釋爲:

$test1="[content]"; 
Where [content] = 1";$test2="2";$test3="3 

有任何解決方法這樣做呢?我需要儘快基本上是強制執行新的比賽,因爲它遇到「不是簡單地在最後

回答

2

你需要讓你的比賽非貪婪您可以通過使用量詞*?,而不是*做到這一點。

$content = '$test1="1";$test2="2";$test3="3";'; 

$out = array(); 

preg_match_all('/\$(.*?)="(.*?)";/', $content, $out); 

var_dump($out); 

輸出:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(11) "$test1="1";" 
    [1]=> 
    string(11) "$test2="2";" 
    [2]=> 
    string(11) "$test3="3";" 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    string(5) "test1" 
    [1]=> 
    string(5) "test2" 
    [2]=> 
    string(5) "test3" 
    } 
    [2]=> 
    array(3) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(1) "2" 
    [2]=> 
    string(1) "3" 
    } 
} 
1

貪婪的表現形式,例如.*將試圖同時滿足其餘快遞到儘可能匹配離子。每個任務分配在一個單獨的行上(並且沒有/s [dot-matches-all]修飾符),.*在遇到的第一個換行符處停止匹配;這就是爲什麼當作業分別在自己的生產線上時,它的工作原理。

可以修改第一個貪婪表達式來代替使用否定字符集;第二貪婪表達式需要進行非貪婪通過附加一個問號(因爲雙引號,可以逃脫,否則你將需要更爲複雜的模式來考慮到這一點):

/\$([^=]*)="(.*?)";/ 

[^=]*將匹配除了等號以外的任何東西,而.*?將盡快匹配,同時滿足剩餘的表達。