Я сопоставляю условные выражения из шаблона 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"
дает
boolean_arg1 && arg2 !== #1292059161_4d03421974c3166a7cae87ddc1002905892eff6453bd4quotes' && arg3 === #1292059161_4d03421974c31d4820850f1f6e06677e741be556352e3
(обратите внимание на кавычки ') после первой замены.
Я не очень хорош в поисках и тому подобном. Мне было интересно, есть ли простое решение для преобразования регулярного выражения в приведенном выше коде в такое, которое соответствует полные строки с экранированными кавычками в них?