正则表达式 - 减号/连字符问题

时间:2011-10-27 12:56:28

标签: regex .htaccess mod-rewrite apache2 httpd.conf

我有一个包含以下内容的网址

/4-new-south-wales/499-some-category.html

我想删除使用mod_rewrite数字和以下连字符。

我有以下规则

RewriteRule (.*)\d+-(.*) $1$2 [R=301,L]

这给了我以下

/4-new-south-wales-nsw/49cross-breeds-designer-dogs.html

这些可以嵌套在任何级别。例如

/a/b/c/4-new-south-wales-nsw/49123123-cross-breeds-designer-dogs.html

我想以

结束
/a/b/c/new-south-wales-nsw/cross-breeds-designer-dogs.html

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

(/.*/)\d+-(.*)

这会解决吗?

。*是贪婪的,所以它也匹配第一个数字字符,只留下最后一个数字与\ d +匹配,所以你的第一个捕获组最终是: / 4-新 - 南 - 线圈纵行/ 49

答案 1 :(得分:0)

尝试以下方法:

RewriteRule (.*?)\d+-(.*?)\d+-(.*) $1$2$3 [R=301,L]

?使模式不合适。

查看并测试rubular

答案 2 :(得分:0)

要在URL路径中替换多个任意放置的/ddd-XXX模式,Apache需要一次更换一个匹配项,然后在每次替换后递归重定向URL。但要正确执行此操作,您需要将RewriteBase语句添加到.htaccess文件,并将其设置为包含.htaccess文件的路径。

这是一个经过测试的.htaccess文件,它可以满足您的需求:

<IfModule mod_rewrite.c>
    RewriteEngine on

    # Set RewriteBase to the URL-path containing this .htaccess file:
    RewriteBase /apache

    # Redirect first "/ddd-XXX" path segment to: "/XXX":
    RewriteRule ^((?:(?!\d+-)[^/]+/)*)\d+-(.*)$ $1$2 [R=301,L]

    # Rewrite the resulting URL path to show.php as a query string
    # (if resulting URL-path is NOT a real file or a directory).
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ show.php?path=$1

</IfModule>

在我的测试系统上,这个.htaccess文件位于/apache目录(这是我设置RewriteBase的目录)。请注意,最终重定向的URL路径可能不是真实的文件!在上面的.htaccess文件中,我有一个额外的规则来处理最终重定向的URL(它不指向真实文件),并将此路径作为查询变量传递给show.php脚本。 / p>