PHP RegExpr error Неизвестный модификатор '(' - PullRequest
3 голосов
/ 22 мая 2010

У меня есть это регулярное выражение:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)

для извлечения ссылок на темы с форума

Теперь, когда я использую его в моем сценарии

$url = "([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)";

preg_match_all плюет: "Неизвестный модификатор" ('"

Это также вызов preg_match

preg_match_all($url, $str, $matches,PREG_OFFSET_CAPTURE,3);

Может кто-нибудь помочь мне с этой явно глупой проблемой

Ответы [ 2 ]

6 голосов
/ 22 мая 2010

Вы должны обернуть свое регулярное выражение в разделители.Подойдет любой символ, который не является специальным метасимволом PCRE, поэтому я буду использовать #:

$url = "#([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)#";

Подробнее о разделителях можно узнать в разделе руководства PHP по разделителям PCRE .

3 голосов
/ 22 мая 2010

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

В вашем случае ведущий ( используется в качестве разделителя, а первое соответствующее закрытие ) отмечает конец регулярного выражения; остальное рассматривается как модификаторы:

([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)
^                                             ^

Но первый символ после конечного разделителя (() не является допустимым модификатором. Поэтому в сообщении об ошибке указывается Неизвестный модификатор '(' .

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

Да, и, кстати: класс символов, такой как [http://some.url.com/index.php?showtopic=\"], представляет только один символ из перечисленных символов. Так что либо h, t, p, :, / и т. Д. Если вы хотите выразить http://some.url.com/index.php?showtopic=" буквально, используйте просто http://some\.url\.com/index\.php\?showtopic=" (не забудьте экранировать мета-символы) .

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