#regex #apache #.htaccess #mod-rewrite
#регулярное выражение #apache #.htaccess #мод-перезапись
Вопрос:
Я выполняю несколько регулярных выражений для строки внутри переменной, чтобы очистить ее для дальнейшего использования в правилах htaccess, но кажется довольно громоздким делать такую простую вещь в нескольких строках:
RewriteCond %{THE_REQUEST} (?<=s)(.*?)(?=s)
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} (^.*)??
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} /(.*)
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
RewriteCond %{ENV:HREFPATH} (.*)/$
RewriteRule ^(.*)$ - [E=HREFPATH:%1]
Как я могу сократить это до 2 строк?
В основном я ищу способ инкапсулировать каждый из этапов агрегации (фильтр) на основе вывода предыдущего выражения, но мои скромные усилия потерпели неудачу после нескольких часов попыток и поиска в Интернете.
Приведенный выше код делает то, что мне нужно, это просто действительно уродливо (не элегантно).
На PHP или в принципе на любом приличном языке это может быть так просто, как:
$HREFPATH = trim(explode(explode(" ",$THE_REQUEST)[1],"?")[0],"/");
-но это НЕ вопрос, связанный с PHP; просто простой способ объяснить, что я имею в виду, и чего я пытаюсь достичь.
Я знаю, что может быть много шаблонов регулярных выражений, которые могли бы (теоретически) работать здесь, но это должно быть совместимо с механизмом регулярных выражений Apache.
Любой ввод будет вознагражден тем же; заранее спасибо.
Ответ №1:
То, что вы делаете в нескольких правилах, может быть сделано в одном, подобном этому:
RewriteCond %{THE_REQUEST} s/ ([^?]*?)/*[s?]
RewriteRule ^ - [E=HREFPATH:%1]
Подробности регулярных выражений:
s
: Сопоставьте пробелы/
: Совпадение 1/
с([^?]*?)
: Лениво сопоставьте 0 или более любых символов, которые не являются?
. Зафиксируйте это значение в%1
/*
: Сопоставьте 0 или более конечных/
с[s?]
: Должно сопровождаться?
или пробелом