2016-02-26 16 views
1

我有描述[變量操作值]結構這樣的字符串:正則表達式提取任何字不(單|雙)引號分隔

type == 'prova' && padposition == "stefano" or 10>var_name 

我需要建立一個正則表達式提取可變名單:

type 
padposition 
var_name 

對他們的申請後處理(基本上它們轉換成PHP數組的鍵):

$arr_name['type'] 
$arr_name['padposition'] 
$arr_name['var_name'] 

我發現匹配單或雙引號分隔字符串方式:

('|")(\w*\w)('|") 

,但我不能(我太無知!)來否定它,或者只是爲了提取非單一的任何單詞或雙引號分隔。

+1

'\ W * \ w':什麼好奇的子模式! –

+1

一種方法是尋找'\ w + =',然後修剪掉空格和等號。 –

回答

3

一個辦法做到這一點(高度可讀,易於維護):

$str = 'type == \'prova\' && padposition == "stefano" or 10>var_name'; 

$pattern = <<<'EOD' 
~ 
# you define first the basic elements (as for a lexer) with named groups 
(?(DEFINE) 
    (?<var> [a-z_]\w*) # variable name 

    (?<dqstr> (?<=") [^\\"]*+ (?s:\\.[^\\"]*)*+ (?=")) # double quoted string 
    (?<sqstr> (?<=') [^\\']*+ (?s:\\.[^\\']*)*+ (?=')) # single quoted string 
    (?<string> \g<dqstr> | \g<sqstr>) # any string 

    (?<num> [0-9]+(?:\.[0-9]+)?) # a number 

    (?<value> \g<string> | \g<num>) # any value 

    (?<comp> [!><=]= | =?[><]) # comparison operator 
) 

# Then you write the pattern using these named groups 

(?J) # allow duplicate named groups 

# variable op value 
(?<key> \g<var>) \h* \g<comp> \h* ["']? (?<val> \g<value>) ['"]? 
| # OR 
# value op variable 
["']? (?<val> \g<value>) ['"]? \h* \g<comp> \h* (?<key> \g<var>) 
~xi 
EOD; 

if (preg_match_all($pattern, $str, $matches, PREG_SET_ORDER)) { 
    $arr_name = []; 
    foreach($matches as $m) { 
     $arr_name[$m['key']] = $m['val']; 
    } 
    print_r($arr_name); 
} 

Pattern demo

相關問題