Допустим, у нас есть этот .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-адресе, которые вам нужно будет проверить в вашем скрипте.
Пример: =@*-+
([^.] +)
[]
: соответствует любому символу в квадратных скобках [^]
: соответствует любому символу, кромеуказан в фигурных скобках ( 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 will be file1.html
и если у вас 2:
folder1/file1.html
: $ 1 будет folder1
, а $ 2 будет соответствовать file1.html
file1.html
: $ 1 будет file1.html
Этот работает как предыдущий, за исключением того, что вы должны указать, какие символы вы хотите.Поэтому, когда вы проверяете свою строку в PHP, вы знаете, какие символы вы получаете.Как и в моем примере с именем файла, мне пришлось добавить \.
, чтобы он распознал точку.Этот также быстрее выполняется.
См. Тест производительности: .htaccess mod_rewrite производительность
Итак, если вы знаете, какой тип запроса вы получите, вы всегда можете использовать последний, но если вы не уверены, вам придется выбрать тот, который больше соответствует вашим потребностям. Между ними может быть больше различий, но основная цель понимания этих регулярных выражений - понять, что они делают или ловят. Кроме того, производительность - это то, что вы должны принять во внимание. Сопоставление всего с последующим синтаксическим анализом запроса в PHP или Python может занять больше времени, чем просто сопоставить их сначала и просто использовать их в вашем скрипте.