Regex для mod_rewrite, чтобы взять только то, что раньше - - PullRequest
0 голосов
/ 18 апреля 2011

Привет, у меня есть URL, который читается как

/users/nick--last-first-middle-bla-bla-bla.html

мне нужно сделать регулярное выражение, которое принимает ник, даже если это так

ni-ck--last-first-middle-bla-bla-bla.html
  1. бла-бла может быть любое количество переменных, мне просто нужно получить часть "ник", независимо от того, что следует за ней, потому что она всегда будет разделена "-".
  2. ник только до 50 символов

Может кто-нибудь предложить рабочее регулярное выражение для переписывания модов, спасибо.

Ответы [ 5 ]

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

Вариант 1:

Если URL-адрес всегда будет иметь ник, последний, первый и средний, за которыми следуют необязательные переменные, а ник должен быть от 1 до 50 символов, то это проверенное правило будет работать.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^users/((?:(?!--)[^/]){1,50})--([^-/]+)-([^-/]+)-([^-/]+)([^/]*)$ index.php?nick=$1&last=$2&first=$3&middle=$4&vars=$5 [L]
 </IfModule>

Дано: /users/ni-ck--last-first-middle-bla-bla-bla.html это правило отделяет и предоставляет следующие $_GET переменные массива:

Array
(
    [nick] => ni-ck
    [last] => last
    [first] => first
    [middle] => middle
    [vars] => -bla-bla-bla.html
)

Опция 2:

Если URL будет всегдаиметь псевдоним от 1 до 50 символов, за которым следует "--", и все, что следует, является необязательным, тогда это проверенное правило будет работать.(Этот раздел не разделяет части имени):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^users/((?:(?!--)[^/]){1,50})--([^/]*)$ index.php?nick=$1&vars=$2 [L]
</IfModule>

Учитывая: /users/ni-ck--last-first-middle-bla-bla-bla.html это правило отделяет и предоставляет следующие $_GET переменные массива:

Array
(
    [nick] => ni-ck
    [vars] => last-first-middle-bla-bla-bla.html
)
0 голосов
/ 19 апреля 2011

^/users/(?(.{0,50}?--)(.*?)|(.{50}).+)-- не работает с обходными путями, но вместо этого использует ленивые квантификаторы и условное выражение (я не знаю, поддерживается ли он mod_rewrite), которое помещает либо короткий ник в группу 1, либо обрезанный ник в группу 2, поэтому Вы можете просто объединить эти группы, чтобы получить запрошенный ник.

^/users/: соответствует начальной строке
(?: начало условного выражения
(.{0,50}?--): [ if ] проверить, есть ли здесь короткий ник (не более 50 символов перед первым --)
(.*?): [ затем ] соответствует любому символу в этой группе (до первого --, см. Ниже, из-за ленивого соответствия)
|: разделитель в условном выражении
(.{50}).+: [ else ] соответствует только первым 50 символам в этой группе
): конец условного выражения
--: финальный матч


На самом деле не совсем понятно, что делать с слишком длинными никами. Если длинные обрезки можно просто игнорировать, а не обрезать, то может быть достаточно следующего?

^/users/(.{0,50}?)-- соответствует только коротким никам в первой группе (ленивый квантификатор)…

0 голосов
/ 18 апреля 2011

^/users/(.{0,50}).*(?=--)(?<!--.*) соответствует "ник" части длиной до 50 символов или до -- (в зависимости от того, что самое короткое) в группе, используя квантификаторы и обходные пути для ограничений.

^/users/: совпадениеначальная строка
(.{0,50}): соответствует любому символу, до 50, в этой группе
.*: соответствует любому символу после 50
, но только до -- (не включительно):
(?=--): положительный взгляд, -- существует сразу после этого местоположения
(?<!--.*): отрицательный взгляд назад, -- не существует нигде до этого местоположения

Обратите внимание, что --требуется или шаблон не будет соответствовать.

0 голосов
/ 19 апреля 2011

Попробуйте следующее правило в вашем файле .htaccess:

RewriteEngine on
Options +FollowSymlinks -MultiViews

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^users/(.{1,50}?)-- /foo.php?name=$1 [L]

ИСПЫТАНИЯ

Если у меня есть foo.php, как это:

<?php var_dump($_SERVER["QUERY_STRING"]); ?>
  1. Для URL /users/nicked-ic-ic-ack--last-first-middle-bla-bla-bla.html печатается:

    string (21) "name = nicked-ic-ic-ack"

  2. Для URL /users/ni-ck--last-first-middle-bla-bla-bla.html печатается:

    string (10) "name = ni-ck"

  3. Для URL /users/nick--last-first-middle-bla-bla-bla.html он печатает:

    string (9) "имя = ник"

  4. Для URL /users/nick--last--first (несколько --) он печатает:

    string (9) "name = nick"

  5. Для URL /users/nicked-ic-ic-nicked-nicked-nicked-nicked-nicked-nicked-nicked-ack--last-first-middle-bla-bla-bla.html он выбрасывает 404 , поскольку длина имени теперь> 50

    404 - Не найдено

0 голосов
/ 18 апреля 2011
/users/((?:-?[0-9a-zA-Z]){,50})

Должен захватить ваш ник за 1 доллар.(Не помню, работает ли не захватывающая скобка в mod-Rewrite или просто потерял ?:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...