mod_rewrite用' - '替换'_'

时间:2010-11-10 11:45:27

标签: regex mod-rewrite replace

我几乎有一个mod_rewrite规则,但我已陷入其中:)

我需要重写

country/[countryname].php 

country/[countryname]/

然而,[countryname]可能有这样的下划线:'south_africa.php'如果确实如此,我想用一个夸张的替换它:'south-africa /'

如果国家/地区有数字,我也想匹配:'france03.php'到'france /'

继承我的规则,它几乎在那里,但即使在下划线之后没有第二部分,它仍然会添加连字符。

RewriteRule ^country/(.*)_(.*?)[0-9]*\.php$ country/$1-$2 [R=301,L]

所以目前'country / south_.php'变成'country / south - /'

有人可以帮我找到拼图的缺失部分吗?感谢。

2 个答案:

答案 0 :(得分:3)

试试这个:

RewriteRule ^country/([^_]*)_([^_]*?)\d*\.php$ country/$1-$2 [R=301,L]

此规则会将网址与单下划线匹配 - 您需要一个不同的规则来获得更多下划线或没有。

如果您想确保$2仅包含字母且不为空,请将([^_]*?)更改为([a-zA-Z]+)

答案 1 :(得分:2)

或者你可以通过几次传递:

# If request is for something in "country/"
RewriteCond %{REQUEST_URI} ^country/.+\.php$

# Replace underscore and digits with (single) hyphen
RewriteRule [_0-9]+ \-

# Remove extension (and possible trailing hyphen)
RewriteRule ^(.*)-?\.php$ $1

# Final rewrite
RewriteRule ^country/(.*)$ country/$1 [R=301,L]

未经测试......并不一定“非常”:)