Использование необязательных обратных ссылок для захвата строки, необязательно заключенной в кавычки - PullRequest
1 голос
/ 19 июня 2011

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

Я хочу быть в состоянии соответствовать

Вот что у меня сейчас есть:

(\w+)\s+('|")([^\2\\]*(\\.[^\2\\]*)*)\2\s*;

Часть ([^\2\\]*(\\.[^\2\\]*)*) взята из http://ad.hominem.org/log/2005/05/quoted_strings.php

К сожалению, у меня есть две проблемы с этим шаблоном.

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

Наличие print "hello world"; работает, но print foobar; не работает. Я не смог сделать обратную ссылку \2 необязательной в конце.

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

Если я попробую регулярное выражение с print 'hello'; print 'foobar';, он просто вернет первую print 'hello'; часть.

Заранее спасибо за помощь.

Редактировать

Вот фрагмент того, что я пытаюсь проанализировать:

listen          80;
server_name     domain.com *.domain.com;
rewrite ^       http://www.domain.com$request_uri? permanent;

Я пытаюсь запечатлеть каждое действие со своими параметрами. По сути, я не хочу разбирать файл конфигурации NGINX: http://wiki.nginx.org/FullExample

Ответы [ 2 ]

2 голосов
/ 19 июня 2011

Обратная ссылка не работает в классе символов [^\2], как это. Это может быть многосимвольная строка, и ее нельзя использовать там. Вы можете обойти это, используя ((?!\2).)* конструкцию. Но было бы действительно проще, если бы вы просто упростили шаблон сопоставления.

Самый простой подход здесь состоит в том, чтобы перечислить три возможных варианта отдельно:

 /(\w+)\s+ (?: '([^']*)' |  "([^"]*)" | (\S+) ) \s*;/x

Очевидно, что тогда вам придется извлекать результаты из наборов результатов [2], [3] или [4] вручную.

1 голос
/ 19 июня 2011

Если вы хотите сопоставить несколько раз, используйте preg_match_all.До тех пор, пока совпадающие строки не пересекаются, вы получите их все.

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