Ответ 1
Скажем, у нас есть этот .htaccess:
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?request=$1 [L]
Выражение, указанное в вашем вопросе, будет иметь следующую логику:
^ (. *) $
-
.
: соответствие любому символу и любому одиночному символу -
*
: совпадение нуля или более предыдущего символа
В основном это будет соответствовать:
-
folder1/file1.html
: $1 будетfolder1/file1.html
-
file1.html
: $1 будетfile1.html
Таким образом, очень просто разобрать весь запрос в PHP или Python. С другой стороны, вы не фильтруете никаких нежелательных символов в URL-адресе, который вам нужно будет проверить в script.
Пример:
[email protected]*-+
([^.] +)
-
[]
: соответствует любому из символов внутри квадратных скобок -
[^]
: сопоставить любой символ, отличный от того, что указано внутри фигурных скобок (ref). -
+
: сопоставить один или несколько предыдущих символов -
[^.]
: совпадение с символом.
. Будет прекращено совпадение, если будет найден символ.
От ref.
Единственными специальными символами или метасимволами внутри класса символов являются закрывающая скобка (]), обратная косая черта(), каретка (^) и дефис (-). Обычные метасимволы являются нормальными символами внутри символьного класса и не требуют экранирования обратной косой черты. Для поиска звезды или плюс используйте [+ *]. Ваше регулярное выражение будет работать нормально, если вы избежите регулярных метасимволов внутри класса символов, но это значительно уменьшает читаемость.
В основном это будет соответствовать:
-
folder1/file1.html
: $1 будетfolder1/file1
-
file1.html
: $1 будетfile1
Это как тот же эффект, что и первый, кроме этой полосы, все после точки .
^ ([^/] +) $
-
[]
: соответствует любому из символов внутри квадратных скобок -
+
: сопоставить один или несколько предыдущих символов -
^
: соответствие началу строки -
[^/]
: совпадение с символом/
. Будет прекращено совпадение при обнаружении символа/
Это как тот же эффект, что и первый, кроме этого, будет проверять любой запрос до /
. Поэтому, если у вас есть несколько папок, вам придется включать несколько раз это регулярное выражение.
В основном это будет соответствовать чему угодно (если у вас есть только один набор):
-
folder1/file1.html
: $1 будетfolder1
-
file1.html
: $1 будетfile1.html
и если у вас есть 2:
-
folder1/file1.html
: $1 будетfolder1
, а $2 будет соответствоватьfile1.html
-
file1.html
: $1 будетfile1.html
Чем больше папок у вас есть, тем больше вы можете добавить правило.
^ ([a-z0-9] +) $ [ ^ ([a-z0-9.] +) $ для этого примера]
-
[]
: соответствует любому из символов внутри квадратных скобок -
+
: сопоставить один или несколько предыдущих символов -
a-z
: сопоставить буквы от a до z -
0-9
: номера совпадений от 0 до 9
(Вы также можете использовать \d или\w)
В основном это будет соответствовать чему угодно (если у вас есть только один набор - добавлена точка):
-
folder1/file1.html
: $1 будетfolder1
-
file1.html
: $1 будетfile1.html
и если у вас есть 2:
-
folder1/file1.html
: $1 будетfolder1
, а $2 будет соответствоватьfile1.html
-
file1.html
: $1 будетfile1.html
Этот файл работает как предыдущий, за исключением того, что вы должны указать, какие символы вы хотите. Поэтому, когда вы проверяете свою строку на PHP, вы знаете, какие символы вы получаете.
Как и в моем примере с именем файла, мне пришлось добавить \.
, чтобы он распознал точку. Это еще быстрее выполнить.
См. контрольный показатель: .htaccess mod_rewrite performance
Итак, если вы знаете, какой тип запроса вы получите, вы всегда сможете использовать последний, но если вы не уверены, вам придется выбрать тот, который больше подходит вам. Там может быть больше разницы между всеми из них, но основная цель понимания этого регулярного выражения заключается в том, чтобы понять, что они делают или ловят. Кроме того, производительность - это то, что вам нужно принять во внимание. Согласование всего, а затем синтаксический анализ запроса на PHP или Python может занять больше времени, чем просто сопоставить их поначалу и просто использовать их в script.