У меня есть это регулярное выражение:
([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 .