2011-05-31 538 views
5

我想要一些帮助匹配以下网址。正则表达式匹配url无文件扩展名

/settings => /settings.php 
/657_46hallo => /657_46hallo.php 
/users/create => /users.php/create 
/contact/create/user => /contact.php/create/user 
/view/info.php => /view.php/info.php 
/view/readme - now.txt => /view.php/readme - now.txt 
/=> [NO MATCH] 
/filename.php => /unknown.php 
/filename.php/users/create => /unknown.php 

如果域名之后的第一个部分是结尾的文件名“.PHP” (见最后2例),它应该重定向到/unknown.php

我想我需要2个正则表达式 1st应该几乎是这样的:^ /([a-zA-Z0-9 _] +)(/)?(。*)?$ 2nd捕获直接文件名“/filename.php”或“/ filename”。 PHP /创建/用户“ 所以我可以重定向到unknown.php

我得到的第一个正则表达式几乎适用于第一个pa RT。 ==============================================

request url: http://domain.com/user/create 
regex: ^/([a-zA-Z0-9_]+)(/)?(.*)?$ 
replace http://domain.com/$1.php$2$3 
makes: http://domain.com/user.php/create 

问题是,它也符合http://domain.com/user.php/create

如果有人能帮助我与两个正则表达式将是巨大的。

回答

1

如果你想匹配.php案件你可以试试这个:

^\/([a-zA-Z0-9_]+)(\/)?(.*)?$ 

看到这里的Regexr

如果你想避免这种情况下试试这个:

^/([a-zA-Z0-9_]+)(?!\.php)(?:(/)(.*)|)$ 

见这里Regexr

(?!\.php)是一个负面展望,确保在这个地方没有.php

+0

这似乎是要做的。 (第一个示例与regexr链接不同,但regexr网站上的示例正在运行:^ /([a-zA-Z0-9 _] + \。php)(/)?(。*)?$ ) – 2011-06-01 13:30:06

1

当你只有一把锤子...

虽然这可能可以用正则表达式来解决,它可能是这个职位的错误的工具,除非你有约束强制使用正则表达式的。

使用'/'作为分隔符来分割字符串,查看第一个组件是否以'.php'结尾;如果是这样,拒绝它,否则将'.php'附加到第一个组件,并使用'/'加入组件。

+1

这将被用作cherokee网络服务器上的重写规则。切诺基网络服务器不允许我拆分网址,一种编程语言确实会使它更容易,但不幸的是这不是一个选项。 – 2011-05-31 20:48:27