Как извлечь данные, используя повторяющиеся регулярные выражения?
Поэтому сейчас я работаю над правилами перезаписи и, по сути, хочу сделать следующее:
\/([\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 завершен по Тьюрингу.