Mod Rewrite Regex - 多个负面前瞻

pb1*_*149 6 php regex apache mod-rewrite negative-lookahead

我目前有工作Mod Rewrite Regex:

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

该正则表达式采用以下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
Run Code Online (Sandbox Code Playgroud)

如果我不够清楚,请告诉我.任何帮助都会很棒.

注意:我已经尝试使用嵌套在已经存在的内容中的负向前瞻(?!(?!))- 并尝试使用|两个负面的前瞻,但两种解决方案都不起作用.我认为也许其他东西更根本错了?

谢谢大家.

编辑:我也尝试了以下 - 我真的认为这会起作用(但很明显,没有!)

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

这样做如下:

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尚未创建,但你可以希望看到我的意思).

pb1*_*149 1

经过大约四天的实验,我最终得到了一个与我最初预期有所不同的解决方案。我只是将所有实际的 URL 操作删除到我的 index.php 文件中,并将所有请求路由到那里。这是我的(更干净的).htaccess 文件:

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

这是我用来解析输入的 URL 的代码块:

preg_match_all('|/([A-Za-z0-9]+) ((?!/)[A-Za-z0-9- .]*)|', $_GET['path'], $matches) ;

        // 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]);
Run Code Online (Sandbox Code Playgroud)

在这样的 URL 上:

http://localhost/frame_with_cms/frame/www/cmd/one/cmd2/two/cmd3/three/cmd4/four/getparam_valuepart1_valuepart2/cmd5/five/
Run Code Online (Sandbox Code Playgroud)

它成功地生成了这些单独的数组,然后我用它们来处理请求:

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

感谢所有花时间阅读和回复的人。