2016-01-06 3 views
0

Это мое текущее регулярное выражение попытка:Regex, используя от внутренней цитаты

$input_lines = 'Data1("begin Data2(hey); end", "hi");';  
preg_match_all("/(.*?)[(](.*?)[)][;]/", $input_lines, $output_array); 

Я хочу это регулярное выражение, чтобы получить:

"begin Data2(hey); end", "hi" 

На третьем массиве, но он просто получает:

"begin Data2(hey 

Я хочу ничего не получить внутри этих двойных кавычек (не близко, когда у нас есть ); внутри " ").

+1

'$ input_lines' представляется недействительным синтаксисом, он будет вызывать ошибки. – Tushar

+0

Проверьте его (http://www.phpliveregex.com/). я использую этот сайт – Justmyhope2016

+0

@ Justmyhope2016 Вы хотите совместить '' begin Data2 (hey); end "," hi "' как 1 целое совпадение или вы хотите 2 отдельных совпадения '" begin Data2 (hey); end "' и "привет"? – Rizier123

ответ

0

Вы можете расширить регулярное выражение так, что он сначала проверяет, есть ли двойные кавычки сразу после открывающей скобки, и если это так, чтобы требовать, чтобы есть один раз перед закрывающей скобкой:

$input_lines = "Data1(\"begin Data2(hey); end\", \"hi\");";  
preg_match_all('/(.*?)[(](".*?"|.*?)[)];/', $input_lines, $output_array); 
print_r ($output_array); 

Выход:

Array 
(
[0] => Array (
     [0] => Data1("begin Data2(hey); end", "hi"); 
    ) 
[1] => Array (
     [0] => Data1 
    ) 
[2] => Array (
     [0] => "begin Data2(hey); end", "hi" 
    ) 
) 

Возможно, вы также хотите иметь эту работу с одинарными кавычками, так что вы бы добавить возможность для этого:

$input_lines = "Data1('begin Data2(hey); end', 'hi');";  
preg_match_all('/(.*?)[(](".*?"|\'.*?\'|.*?)[)];/', $input_lines, $output_array); 
print_r ($output_array); 

Затем, вы также хотите, чтобы правильно справиться с сбежавших кавычки внутри входных данных, так что вы бы распространить его на это:

$input_lines = "Data1('begin Data2(\'hey\'); end', 'hi');";  
preg_match_all('/(.*?)[(](".*?(?:[\\\\]".*?)*"|\'.*?(?:[\\\\]\'.*?)*\'|.*?)[)];/', 
       $input_lines, $output_array); 
print_r ($output_array); 

выход будет:

Array 
(
[0] => Array (
     [0] => Data1('begin Data2(\'hey\'); end', 'hi'); 
    ) 
[1] => Array (
     [0] => Data1 
    ) 
[2] => Array (
     [0] => 'begin Data2(\'hey\'); end', 'hi' 
    ) 
) 

Примечание так что вы также будете по-прежнему соответствовать строкам, которые не содержат таких котировок, например

$input_lines = "Data1(mydata);"; 

По-прежнему будет соответствовать и давать ожидаемые результаты.

+0

если я использую (Data1 ('begin Data2 (' hey '); end', 'hi');) - добавьте qutation в Data2, остановится после данных 2 и теперь покажет конец и привет! ! это моя проблема! – Justmyhope2016

+0

Этот пример кажется недействительным синтаксисом, самые скрытые кавычки должны быть экранированы, например, «Data1 (« begin Data2 («hey \»); end ',' hi '); ". Если это то, что вы хотите разобрать, я обновлю свой ответ. – trincot

1

Просто используйте простое регулярное выражение, чтобы соответствовать всем (. соответствует чему угодно, кроме новой строки; * между 0 и более раз; Также обратите внимание, что это жадно) между двумя кавычками, например.

$input_lines = 'Data1("begin Data2(hey); end", "hi");'; 
preg_match('/(".*")/', $input_lines, $matches); 

print_r($matches); 
Смежные вопросы