[регулярные выражения] не могу разобраться с утверждениями

oleg1331

пример из руководства http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.p...
(?<!foo)bar
не найдёт вхождения "bar", которым не предшествует "foo".
тем не менее, когда я запускаю
<?
preg_match("/^(?<=foo)bar$/", "foobar", $matches);
print_r($matches);
?>

у меня выводится пустой массив. Где меня глючит?

artimon

Вообще-то в переводе ошибка.
For example, (?<!foo)bar does find an occurrence of "bar" that is not preceded by "foo".
но это не важно.
В твоём коде надо убрать крышку или занести её в assertion
<?
preg_match("/(?<=foo)bar$/", "foobar", $matches);
print_r($matches);
?>

или
<?
preg_match("/(?<=^foo)bar$/", "foobar", $matches);
print_r($matches);
?>

т.к. иначе ты ищешь текст bar который находится в начале строки, но при этом перед ним должен стоять текст foo.

artimon

assertions не занимают места, они просто проверяются и выкидываются.
An assertion is a test on the characters following or preceding the current matching point that does not actually consume any characters.

oleg1331

спасибо нельзя все-таки такие маны по-диагонали читать...

oleg1331

хм. с этим вроде разобрались, только легче от этого стало не намного. Мне нужно настроить шаблона так, чтобы mod_rewrite перенаправлял все файлы в папку modules. Т.е. для того, чтобы не было зацикливания, нужно, чтобы урлы, которые начинаются с modules/ не обрабатывались вообще. как?

artimon

Как-то так…
RewriteCond %{REQUEST_URI} !^/modules/
RewriteRule …

Прочитай уже мануал по mod_rewrite и примеры применения.
Оставить комментарий
Имя или ник:
Комментарий: