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

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 脚本。

【讨论】:

以上是关于正则表达式 - 减号/连字符问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式捕获科学记数法中的减号?

35 Python - 正则表达式 综合应用

在这个正则表达式中包含“减号”,如何?

求...js正则表达式 只能是字母,数字,减号,下划线组成,

Javascript 正则表达式到数字/十进制和减号

java学习笔记-4 正则表达式