Php 正则表达式:通过匹配字符串中间的转义引号来匹配字符串而不中断匹配字符串

Php 正则表达式:通过匹配字符串中间的转义引号来匹配字符串而不中断匹配字符串,php,regex,templates,Php,Regex,Templates,我正在从模板if语句中匹配条件。问题在于在将条件语句分解为单独的条件之前解析出字符串 在条件分解之前,我用占位符替换字符串条件,这样字符串就不会干扰分解模式匹配 下面的代码做得很好 // remove quoted strings from conditional elements as will conditional tokenising below if (preg_match_all('/([\"\'])([^\\1]*?)\\1/s', $conditions, $string_mat

我正在从模板if语句中匹配条件。问题在于在将条件语句分解为单独的条件之前解析出字符串

在条件分解之前,我用占位符替换字符串条件,这样字符串就不会干扰分解模式匹配

下面的代码做得很好

// remove quoted strings from conditional elements as will conditional tokenising below
if (preg_match_all('/([\"\'])([^\\1]*?)\\1/s', $conditions, $string_matches))
{   
    $uid = uniqid(time().'_');
    $strings = array(
            'id' => $uid, 
            'matches' => array()
        ); 
    $replacements = array();
    foreach($string_matches[0] as $key=>$match)
    {
        $match_id = '#'.$uid.md5($match);
        $replacements[$match] = $match_id;
        $strings['matches'][$match_id] = array(
                'match' => $match,
                'content' => $string_matches[2][$key],
            );
    }
    $conditions = str_replace(array_keys($replacements), array_values($replacements), $conditions);
}
它符合以下几点:

boolean_arg1 && arg2 !== 'testing multi quotes' && arg3 === "test & yup" -or-
boolean_arg1 && arg2 !== 'testing "multi" quotes' && arg3 === "test & yup"
给我

boolean_arg1 && arg2 !== #1292059008_4d0341809c0f74062e5ac5086fb24f8e8383a137a5a5e && arg3 === #1292059008_4d0341809c0f7d4820850f1f6e06677e741be556352e3
boolean_arg1 && arg2 !== #1292059102_4d0341de3f5196213c34e77a2cfbb11f867f9ed57c85f && arg3 === #1292059102_4d0341de3f519d4820850f1f6e06677e741be556352e3
但是,在字符串中引入转义引号会破坏转义字符串处的模式匹配

boolean_arg1 && arg2 !== 'testing "multi" \'quotes' && arg3 === "test && yup"
给予

(注意引号)在第一次更换之后


我不太擅长做查找之类的工作。我想知道是否有一个简单的解决方案可以将上面代码中的正则表达式转换为一个匹配完整字符串和其中的转义引号的正则表达式?

使用一个反映转义序列的模式,如:

/"(?:[^"\\]*|\\["\\])*"|'(?:[^'\\]*|\\['\\])*'/

只有分别知道
\\
\“
\'
的转义序列。您可以通过更改regex引发编译错误的
[“\\]
/
['\]

来扩展它们?我原以为是?:[但转义后它就不起作用了。不知道为什么。@buggedcom:确保正确地转义
\‍和字符串中的引号。
/"(?:[^"\\]*|\\["\\])*"|'(?:[^'\\]*|\\['\\])*'/