从报价单内部使用Regex


Regex using from inside of quotation

这是我当前的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);";

仍将匹配并给出预期结果。