Как извлечь данные, используя повторяющиеся регулярные выражения?

Поэтому сейчас я работаю над правилами перезаписи и, по сути, хочу сделать следующее:

\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)\/([\w+-]+)...

Как вы можете видеть, я хочу повторять один и тот же шаблон снова и снова, который я мог бы просто выписать, сколько бы раз ни подходили моим целям в настоящее время, но это не очень элегантно. Поскольку это один и тот же шаблон для каждого захвата, было бы хорошо, если бы это можно было написать произвольным образом, что-то вроде следующего:

(?:\/([\w+-]+))+

Тогда в идеале я мог бы назначить переписывание следующим образом:

$1.php?one=$2&two=$3...

Кто-нибудь знает, возможно ли это? Может не быть, но никогда не больно спрашивать.

1 ответ

Решение

Эта идея называется группой повторного захвата, и это невозможно. Представьте себе это так: захваченные персонажи ([\w+-]+) помещаются в буфер, а второе совпадение просто перезаписывает первое.

Практическим решением было бы просто захватить все это и обработать его в php (или любом другом серверном скрипте):

RewriteRule (.*) index.php?req=$1

тогда в PHP:

list($_GET['one'], $_GET['two'], $_GET['three']) = explode('\', $_GET['req'])

В качестве альтернативы... ну, это крайне непрактично, но вы можете сделать это с помощью mod_rewrite с помощью рекурсии: каждая итерация распознает последний сегмент, передаст его в строку query_string и т. Д. Это не будет работать в производственном процессе (так как Apache разумно имеет предел рекурсии установлен на что-то низкое), но это хорошее напоминание о том, что mod_rewrite завершен по Тьюрингу.

Другие вопросы по тегам