Регулярные выражения. Спец. символ ИЛИ.

DizeL

Новичок
Регулярные выражения. Спец. символ ИЛИ.

Здравствуйте все.

Проблема в использовании регулярных выражений.
Делаю ЧПУ для нашей КМС.
Победил удачно .htaccess, там надо было правила для изображений, КСС и прочих урлов прописать.
Всё остальное идёт прямо в рут-индекс, который производит уже дишифровку и вызов нужных страниц.

Задача следующая:
При помощи регулярных выражений переделать все входящие запросы из:
- test.ru/test1/test2/test2/test4.html
- test.ru/test2/test2/test4.html
- test.ru/test2/test4.html

в test.ru/test4.html

Написал след. правило:
PHP:
$param=preg_replace("`(?:/[\w\d]*/[\w\d]*/[\w\d]*)|(?:/[\w\d]*/[\w\d]*)|(?:/[\w\d]*)/([\w\d]*)`","\\1", $param);
Теперь при входящей строке ... мы получаем...:
string(37) "/production/press/ps1000/service.html", string(13) "/service.html"
но при:
string(31) "/production/press/contacts.html" string(5) ".html"
и т.д.

Т.е. если колв-о вирутальних папок <3, то не работает выражение.
Было у меня предположение, что не срабатывает тройное условия.
Попробовал так:
PHP:
$param=preg_replace("`(?:/[\w\d]*/[\w\d]*/[\w\d]*)|(?:/[\w\d]*/[\w\d]*)/([\w\d]*)`","\\1", $param);
Только с 2-мя условиями - всё равно не работает.

Кто у нас гуру в выражениях, помогите найти ошибку.
И ещё, попутный вопрос:
читал, но не особо понял, когда необходимо ставить в начеле строки ^ и в конце строки $? В учебнике написано было, что всегда, что это означает начало и конец строки поиска.
Однако на PHP http://www.php.net/manual/ru/function.preg-replace.php они не используются, и если я ставлю их в своём выражении, то вообще ничего не работает...
Кто-то может доступно объяснить их назначение?

Заранее спасибо.
Буду очень признателен за помощь.
Всем успехов в работе...
 

DizeL

Новичок
Автор оригинала: dimagolov
разбей URL explode и возьми нужные элементы массива
Мда, интересный вариант...
Но вопрос уже решился.
Просто надо было внести слэшь в условие.
Вот так:
PHP:
$param=preg_replace("`(?:/[\w\d]*/[\w\d]*/[\w\d]*/)|(?:/[\w\d]*/[\w\d]*/)|(?:/[\w\d]*/)([\w\d]*)`","\\1", $param);
И всё работает...

Кстати, как-то наталкивался на вопрос, но забыл, что быстрее работает? Строковые функции или регулярные выражения?
 

HraKK

Мудак
Команда форума
Смотря что делать. В даном случие будет работать быстрее строковая раз в 10. НО. проблема что apache быстрее отработает правило в силу того что он откомпелирован а пхп интерпритатор. Но если б это было в пхп - то однозначно строковые.
 
Сверху