2016-02-26 5 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': что любопытный подшаблон! –

+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