这是我当前的regex尝试:
$input_lines = 'Data1("begin Data2(hey); end", "hi");';
preg_match_all("/(.*?)[(](.*?)[)][;]/", $input_lines, $output_array);
我希望这个正则表达式得到:
"begin Data2(hey); end", "hi"
在第三个阵列上,但它只得到:
"begin Data2(hey
我不想在这些双引号中得到任何内容(当);
在" "
中时不闭合)。
只需使用一个简单的正则表达式来匹配两个引号之间的所有内容(.
匹配除新行之外的任何内容;*
在0到更多次之间;还请注意它是贪婪的),例如
$input_lines = 'Data1("begin Data2(hey); end", "hi");';
preg_match('/(".*")/', $input_lines, $matches);
print_r($matches);
您可以扩展正则表达式,使其首先检查左括号后是否有双引号,如果是,则要求右括号前有双引号:
$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);";
仍将匹配并给出预期结果。