Вы можете расширить регулярное выражение так, что он сначала проверяет, есть ли двойные кавычки сразу после открывающей скобки, и если это так, чтобы требовать, чтобы есть один раз перед закрывающей скобкой:
$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);";
По-прежнему будет соответствовать и давать ожидаемые результаты.
'$ input_lines' представляется недействительным синтаксисом, он будет вызывать ошибки. – Tushar
Проверьте его (http://www.phpliveregex.com/). я использую этот сайт – Justmyhope2016
@ Justmyhope2016 Вы хотите совместить '' begin Data2 (hey); end "," hi "' как 1 целое совпадение или вы хотите 2 отдельных совпадения '" begin Data2 (hey); end "' и "привет"? – Rizier123