На вид идентичный Regex Apache RewriteRule ... В чем разница? - PullRequest
1 голос
/ 03 апреля 2011

Дорогие люди, Я пытаюсь выяснить, в чем разница между этими двумя

RewriteRule ^([a-z][a-z])/(.*?)(-.*)?$   /$2?ln=$1 [L]
RewriteRule ^([a-z][a-z])/([^/]+)(-.*)?$ /$2?ln=$1 [L]

Они кажутся идентичными, и оба, кажется, работают нормально, но разница должна быть ...

Любой из них должен быть установлен для перенаправления с дополнительной информацией за именем файла:

например. en/something-to-love >> something?ln=en

Ответы [ 4 ]

2 голосов
/ 03 апреля 2011

Точка '.' используется слишком часто и редко требуется. Скажи, что ты имеешь в виду и имей в виду то, что говоришь! Вот как бы я это написал:

RewriteRule ^([a-z]{2})/([^/\-]+)(-[^/]*)?$ index.php?ln=$1 [L]
1 голос
/ 03 апреля 2011

Есть большая разница.Давайте проверим оба выражения в строке aa / bbb / cccc / ddd / -eeeee .Первая

^([a-z][a-z])/(.*?)(-.*)?$

приведет к трем группам совпадений

1: (aa)
2: (bbb/cccc/ddd/)
3: (-eeeee)

, а вторая ^([a-z][a-z])/([^/]+)(-.*)?$ не будет ничего совпадать.

Ключ в том, что впервое выражение, которое у вас есть (.*?)(-.*)?, что означает, что первая группа - это что угодно, пока не будет найдено - .Если - соответствует, тогда начните третью группу.

Во втором выражении у вас есть ([^/]+)(-.*)?, т. Е. Поместить все до / во вторую группу, а затем, если сопоставлено - , создать третью группу,Проблема в том, что не совпадает / и начинается новая группа с - .

Если вы проверите второе выражение на двух строках aa / bbb- / eeeee и aa / bbb / -eeeee , вы увидите, что будет получена только первая строкав любых матчах

1: (aa)
2: (bbb)
3: (-/eeeee)

и второго не будет.

Надеюсь, это помогло.

Примечание: все упомянутые тесты я провел на www.RegexTester.com .

1 голос
/ 03 апреля 2011

Apache ленивый по умолчанию. Так что в перезаписи .* и .*? равны. Вот почему ваш [^/]+ действительно [^/]+?.

У вас нет / после исходного, поэтому [^/] и . дают одинаковый результат.

Что касается * и +, вы знаете, что у вас наверняка будет что-то после en/ в вашем URL, поэтому * просто шире, оно всегда будет + (хотя бы один символ будет следовать за косой чертой).

Если вы примените эти факты, легко заметить, что они будут работать одинаково в вашей ситуации.

1 голос
/ 03 апреля 2011

Хотя они могут быть похожими, они не идентичны :

  • .*? - любой символ (ленивый) или нет ,
  • [^/]+ - любой символ, кроме косой черты (/), хотя бы один .

Второй не ленивый, поэтому вы получите something-to-love?ln=en (чтобы получить только something, добавьте знак вопроса в конце: [^/]+?).

Выбор между этими двумя вариантами зависит от ваших потребностей.

Кстати, вы можетеуменьшить [a-z][a-z] до [a-z]{2}.

...