Мод Rewrite Regex - несколько негативных взглядов - PullRequest
6 голосов
/ 18 июля 2011

В настоящее время у меня есть работающий мод Переписать регулярное выражение:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(.+)) $1?$2=$3&%1 [L]

Это регулярное выражение берет следующий URL-адрес и преобразует его в следующий URL-адрес:

www.site.com/cmd1/param/cmd2/param2/stillparam2 и превращает его в www.site.com/index.php?cmd1=param&cmd2=param2/stillparam2

Это прекрасно работает, но я также хотел бы создать еще одно негативное утверждение, чтобы гарантировать, что блок URL - то есть параметр /texthere/ - не содержит подчеркивания.Неверная строка может выглядеть так: www.test.com/cmd/thing/getparam_valuehere;регулярное выражение должно анализировать cmd/thing как пару ключ и значение и игнорировать остальную часть строки.Затем я также написал бы другой RewriteRule, чтобы блок URL с подчеркиванием в нем был добавлен в качестве другого параметра URL.Произойдет следующий перевод URL:

www.test.com/cmd/param1/cmd2/directory/param2/sortorder_5
www.test.com?cmd=param1&cmd2=directory/param2&sortorder=5

Пожалуйста, дайте мне знать, если я не был достаточно ясен.Любая помощь была бы полезна.

NB: я пытался использовать отрицательный взгляд, вложенный в уже существующий - (?!(?!)) - и пытался использовать | на двух отрицательных взглядах, но ни одно из решений не сработало.Я подумал, что, возможно, что-то еще было в корне неправильно?

Спасибо всем.

Редактировать: Я также попробовал следующее - что я действительно думал, что будет работать (но, очевидно,, не надо!)

RewriteRule ^(.*/)?((?:cmd)[^/]*)/((?!(?:cmd)[.+]*)(?![.+]*(?:_)[.+]*)(.+)) $1?$2=$3&%1 [L]

Это делает следующее:

www.test.com/cmd/param1/sortorder_1/ переводится в www.test.com?cmd=param1/sortorder_1/

Когда вместо этого должно стать: www.test.com?cmd=param1&sortorder=2/.Правило перевода /sortorder_2/ в &sortorder=2 еще не создано, но, надеюсь, вы понимаете, о чем я).

Ответы [ 2 ]

1 голос
/ 23 июля 2011

После примерно четырех дней экспериментов у меня появилось несколько иное решение, чем я первоначально ожидал найти. Я просто удалил все фактические манипуляции с URL в мой файл index.php и направил туда все запросы. Вот мой (намного чище) файл .htaccess:

Options +FollowSymlinks
RewriteEngine On
RewriteCond %{QUERY_STRING} (.*)
RewriteRule (.*) index.php?path=$1 [QSA,L]

и вот блок кода, который я использовал для разбора введенного URL:

preg_match_all ('| / ([A-Za-z0-9] +) ((?! /) [A-Za-z0-9- .] *) |', $ _GET ['path'], $ соответствует);

        // Remove all '$_GET' parameters from the actual $_GET superglobal:
        foreach($matches[0] as $k => $v) {
            $search = '/' . substr($v, 1);
            $_GET['path'] = str_replace($search, '', $_GET['path'], $count);
        }

        // Add $_GET params to URL args
        for ($i = 0; $i < count($matches[1]); $i++) {
            self::$get_arguments[$matches[1][$i]] = $matches[2][$i];
        }

        // Retrieve all 'cmd' properties from the URL and create an array with them:
        preg_match_all('~(cmd[0-9]*)/(.+?)(?=(?:cmd)|(?:\z))~', $_GET['path'], $matches);

        if (isset($matches[1][0])) {
            return self::$url_arguments = array_combine($matches[1], $matches[2]);

На таком URL-адресе:

http://localhost/frame_with_cms/frame/www/cmd/one/cmd2/two/cmd3/three/cmd4/four/getparam_valuepart1_valuepart2/cmd5/five/

Он успешно создает эти отдельные массивы, которые я затем использую для обработки запросов:

Array
(
    [getparam] => valuepart1_valuepart2
)
Array
(
    [cmd] => one/
    [cmd2] => two/
    [cmd3] => three/
    [cmd4] => four/
    [cmd5] => five/
)

Спасибо всем, кто нашел время, чтобы прочитать и ответить.

0 голосов
/ 20 июля 2011

Не проще ли сохранить ваше рабочее правило и переписать param_value в строку запроса перед вашим текущим правилом?

Что-то вроде

RewriteRule ^(.*)?/([^_/]+)_([^/]+)/ $1/?$2=$3 [N,QSA]

должен добавить все / param_value / parts в строку запроса как param = value.

Будьте осторожны, используя флаг N, у вас может получиться бесконечный цикл.

...