У меня есть это регулярное выражение:
([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 spits: "Неизвестный модификатор" ('"
Это также вызов preg_match
preg_match_all($url, $str, $matches,PREG_OFFSET_CAPTURE,3);
Может ли кто-нибудь помочь мне с этой, очевидно, глупой проблемой
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=" буквально, используйте только http://some\.url\.com/index\.php\?showtopic=" (не забудьте избежать метасимволов).
Вам нужно обернуть свое регулярное выражение в разделители. Любой персонаж, который не является особым метасимволом PCRE, будет работать, поэтому я буду использовать # :
$url = "#([http://some.url.com/index.php?showtopic=\"]*)([0-9]+(?:\.[0-9]*)?)#";
Вы можете узнать больше о разделителях в разделе руководства PHP для разделителей PCRE .