2010-01-08 2 views
0

Это код, я использую,оптимизации Довольно URL-адреса в .htaccess

<IfModule mod_rewrite.c> 
RewriteCond %{SCRIPT_FILENAME} !-d 
RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteRule ^([^/]+)/?([^/]+) index.php?user=$1&do=$2 [L] 
</IfModule> 

если я дать ему abcd/1234 он будет захватывать abcd первый затем 1234 в качестве второй переменной. Но если код был abcd/ или abcd, первый захват остается таким же, но второй захват становится d. Это не вызовет проблем в самом PHP-коде, но было бы более эффективным, если бы оно не было захвачено в первую очередь.

oh, чтобы уточнить, для страницы index.php не требуется ни первый, ни второй захват. Но изменит свою цель, если они существуют.

любая помощь с кодом регулярного выражения будет оценена по достоинству, и если есть какие-либо улучшения или более эффективные записи, я был бы очень благодарен за это!

Большое спасибо:
Я использую этот инструмент http://gskinner.com/RegExr/, чтобы проверить это.

ответ

0

Очень простая модификация:

^([^/]+)/?([^/]*) 
+0

работал: D Вы видите какую-либо возможность для улучшения кода? И знаете ли вы, почему предыдущий код будет захватывать только d? спасибо! – Mohammad

0

Вопросительный знак в правиле вместе со вторым знаком плюс вызывает его разделение таким образом. Вы должны удалить вопросительный знак, так как вам уже требуется хотя бы один символ во второй группе.

Edit: В этом случае, используйте:

RewriteRule ^([^/]+)(/([^/]+))?$ index.php?user=$1&do=$3 [L] 
+0

Я проверю это! только для того, чтобы прояснить, ни первый, ни второй захват не требуется, спасибо:) – Mohammad

1

Вторая часть ($ 2) является не опциональным, потому что вы написали [^/]+. Я хотел бы заменить все это на ^([^/]+)(?:/([^/]+))?, что приводит к следующим результатам:

ABCD -> $ 1 = 'ABCD' $ 2 = ''

ABCD/-> $ 1 = 'ABCD' $ 2 = ''

abcd/something -> $ 1 = 'abcd' $ 2 = 'something'

+0

Регулярное выражение, которое вы предоставили, также работает! есть ли вообще знать, какой из рабочих кодов ваш и^([^ /] +) /? ([^ /] *) более эффективен в этом случае? Спасибо за объяснение. – Mohammad

+1

Я только что проверил тест с помощью модуля RePix Python (с скомпилированными регулярными выражениями, выполнив 10000000 совпадений на коротких примерах URL, таких как «abcdefg/bam»). Мое регулярное выражение заняло 54 секунды, а регулярное выражение KiNgMaR заняло 45 секунд. Kinda ожидал этого ... Поскольку оба регулярных выражения верны, вы должны пойти с более быстрым;) – AndiDog

+0

это потрясающий тест AndiDog, спасибо за усилия и разъяснения, очень благодарен! – Mohammad

 Смежные вопросы

  • Нет связанных вопросов^_^