Разбор блоков с регулярным выражением в PHP - PullRequest
1 голос
/ 31 марта 2011

Я застрял при разборе строки, содержащей пары ключ-значение с операторами между ними (как показано ниже) в PHP. Я планирую использовать регулярное выражение для его анализа (хотя я не очень хорош).

key: "value" & key2 : "value2" | title: "something \"here\"..." &( key: "this value in paranthesis" | key: "another value")

В основном, в приведенном выше блоке указаны следующие единицы:

  1. key - Все, что квалифицируется как переменная javascript.
  2. value - любая строка длинная или короткая, но заключенная в двойные кавычки ("").
  3. pair - (key:value) Ключ и значение, объединенные двоеточием, как в объектах javascript.
  4. operator - (& или |) Просто указывает «И» или «ИЛИ».

Может быть несколько блоков, вложенных в скобки ( и ).

Вдохновленный Мэттом (/2021095/preobrazovanie-regulyarnogo-vyrazheniya-javascript-v-vyrazhenie-php-pcre) Я использовал следующие регулярные выражения.

$regs[':number'] = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)';
$regs[':oneChar'] = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
$regs[':string'] = '(?:\"'.$regs[':oneChar'].'*\")';
$regs[':varName'] = '\\$(?:'.$regs[':oneChar'].'[^ ,]*)';
$regs[':func'] = '(?:{[ ]*'.$regs[':oneChar'].'[^ ]*)';
$regs[':key'] = "({$regs[':varName']})";
$regs[':value'] = "({$regs[':string']})";
$regs[':operator'] = "(&|\|)";
$regs[':pair'] = "(({$regs[':key']}\s*:)?\s*{$regs[':value']})";

if(preg_match("/^{$regs[':value']}/", $query, $matches))
{
  print_r($matches);
}

При выполнении вышеупомянутого PHP выдает ошибку около условия IF

Warning: preg_match() [function.preg-match]: Unknown modifier '\' in /home/xxxx/test.xxxx.com/experiments/regex/index.php on line 23

Я пытался preg_match с: string и: oneChar, но все равно я получаю ту же ошибку. Поэтому я чувствую, что что-то не так в: oneChar reg ex. Пожалуйста, помогите мне в решении этой проблемы.

1 Ответ

0 голосов
/ 31 марта 2011

Я вижу по крайней мере одну ошибку во втором регулярном выражении ($ regs [': oneChar']).В нем есть косая черта.И это противоречит тому, что в preg_match в качестве разделителей используется прямой слеш.Вместо этого используйте preg_match("@^{$regs[':value']}@", $query, $matches).

Вам также может понадобиться использовать preg_quote во входной строке.

$query = preg_quote($query, '/');

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

...