正则表达式 - 减号/连字符问题
Posted
技术标签:
【中文标题】正则表达式 - 减号/连字符问题【英文标题】:Regular Expression - minus/hyphen character issue 【发布时间】:2011-12-16 11:59:12 【问题描述】:我有一个包含以下内容的网址
/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
感谢您的帮助。
【问题讨论】:
这里的问题在哪里?请准确告诉我们您需要重写规则来做什么。 嗨,我希望重写规则“使用 mod_rewrite 删除数字和以下连字符” 结果到底应该是什么?/new-south-wales-nsw/cross-breeds-designer-dogs.html
?所以换一两个?还有更多吗?
我想删除数字 4 和 499 干杯。是的 morja - 这就是我想要的结果,尽管它可能是 /a/b/c/new-south-wales-nsw/cross-breeds-designer-dogs.html 干杯
【参考方案1】:
(/.*/)\d+-(.*)
这会解决它吗?
.* 是贪心的,所以它也会匹配第一个数字字符,只留下最后一个数字与 \d+ 匹配,所以你的第一个捕获组最终是: /4-新南威尔士/49
【讨论】:
嗨 Pcaclcao,我测试了您的正则表达式,它删除了嵌套级别,因此结果删除了我的帖子编辑中的 /a/b/c。 我没有设置 Apache 来测试这个,而是使用常规文本编辑器并将我的正则表达式替换为:/a/b/c/4-new-south-wales-nsw /49123123-cross-breeds-designer-dogs.html 给了我:/a/b/c/4-new-south-wales-nsw/cross-breeds-designer-dogs.html 这不是你需要的吗? 对不起,如果我不清楚。我想删除数字和尾随连字符。例如。从提供的 url 中删除 4- 和 499-。我已经在正则表达式编辑器中测试了我的解决方案,但是当我将相同的正则表达式应用于 .htaccess 时,我得到了上面连字符和单个数字消失的问题。 您的答案使用以下调整项:RewriteRule (.*/)\d+-(.*) $1$2 [R=301,L]。我知道我的问题不够清楚 - 我可以接受你们两个吗? 不幸的是没有 :) 选择一个并赞成另一个/两者。我们不会生气的,保证!【参考方案2】:尝试以下方法:
RewriteRule (.*?)\d+-(.*?)\d+-(.*) $1$2$3 [R=301,L]
?
使模式变得不贪婪。
查看和测试rubular
【讨论】:
感谢 morja - 一些网址只有一个数字组合,而另一些则有两个。我使用了 RewriteRule (.*?)\d+-(.*) $1$2 [R=301,L] ,它正在工作。所以我需要第一组的不贪心【参考方案3】:要替换 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
脚本。
【讨论】:
以上是关于正则表达式 - 减号/连字符问题的主要内容,如果未能解决你的问题,请参考以下文章