Регулярное выражение: сопоставление строк без прерывания строки сопоставления путем сопоставления с экранированной кавычкой в ​​середине строки - PullRequest
0 голосов
/ 11 декабря 2010

Я сопоставляю условные выражения из шаблона 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

(обратите внимание на кавычки ') после первой замены.

Я не очень хорош в поисках и тому подобном. Мне было интересно, есть ли простое решение для преобразования регулярного выражения в приведенном выше коде в такое, которое соответствует полные строки с экранированными кавычками в них?

1 Ответ

1 голос
/ 11 декабря 2010

Используйте шаблон, который отражает escape-последовательности, такие как:

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

При этом известны только escape-последовательности \\ и \" или \' соответственно. Вы можете расширить их, изменив ["\\] / ['\\].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...