Regex 如何从URL中提取数字并将其保存在变量中?

Regex 如何从URL中提取数字并将其保存在变量中?,regex,perl,nginx,pcre,Regex,Perl,Nginx,Pcre,我有一个转发请求,其中涉及一系列具有生产ID的产品 http://www.example.com/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_05315.htm 到 因此,我想创建一个正则表达式模式来匹配原始URL中的四位或五位产品ID,并使用一个变量来保存它。然后我们可以重用该变量来构建目标链接 我像以前一样制定了一个规则,但它不起作用。这里有人能帮我吗?或者给我举一些我可以模仿的例子 location ~ ^/abc/en_us

我有一个转发请求,其中涉及一系列具有生产ID的产品

http://www.example.com/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_05315.htm

因此,我想创建一个正则表达式模式来匹配原始URL中的四位或五位产品ID,并使用一个变量来保存它。然后我们可以重用该变量来构建目标链接

我像以前一样制定了一个规则,但它不起作用。这里有人能帮我吗?或者给我举一些我可以模仿的例子

location ~ ^/abc/en_us/(?<myvar>[0-9][0-9][0-9][0-9]|[0-9][0-9][0-9][0-9][0-9]) {
 # use variable $myvar here
 #if ( $myvar = "sth" ) { ... }
 rewrite ^/$1/$2/$myvar;
}
如果$location=~m/^abc.*\d+.htm/,则使用:$myvar=$1


$1将是在.htm之前匹配的第一组数字

你会想要这样的东西

server {
    listen 80; 
    server_name www.example.com;
    rewrite ^/abc/en_us/Products/Cards/Note-Cards/Laser-Note-Cards_([0-9]+).htm /products/cards/$1 last;
}

映射是捕获变量值的好方法。使用正则表达式是一个安全的地方;这意味着它确实会破坏您的配置与正则表达式位置的自然流动,请参见:。该变量在请求周期的早期设置,可以在整个配置过程中使用

map $uri $prod_id {
    ~(?<p_id>\d+)\.htm$ $p_id;
}

server {
    server_name www.example.com;
    return 200 "Production id: $prod_id
";
}

谢谢你的回复。我可以使用一些参数或通配符来替换卡片、注释卡片和这些数字之前的字符串吗?原因是我们有不同的产品类别组成产品链接。例如/abc/en_us/Products/binder/single binder/XXX-12345.htm。非常感谢您的回复。我能够通过使用return 200 Production id:$prod_id获得显示的变量值。但是,当我尝试设置location指令时,我无法获得转发工作。我的转发如下:您可能需要使位置更加具体。我的例子可能太笼统了。我已经在示例前缀位置添加了另一个目录,但您可能需要进行更多的实验。
map $uri $prod_id {
    ~(?<p_id>\d+)\.htm$ $p_id;
}

server {
    server_name www.example.com;
    return 200 "Production id: $prod_id
";
}
location /avery/en_us/Products/ {
    return 301 http://www.avery.com/$prod_id;
}
Finally, I got it working by using "mapping" and regex with if. Thanks for all the help. 

First, define the variale from the URL. 
map $uri $prod_id {
      ~(?<p_id>\d+)\.htm$ $p_id;
 }

Second, make rewrite rule based on if statement. 
if ($uri ~ "^/avery/en_us/Products/([0-9a-zA-Z-_]*)/([0-9a-zA-Z-_]*)/([0-9a-
 zA-Z-_.]*).htm$") {
             rewrite ^/avery/en_us/Products/([0-9a-zA-Z-_]*)/([0-9a-zA-Z-
 _]*)/([0-9a-zA-Z-_.]*).htm$ http://www.avery.com/$prod_id permanent;
    }