正则表达式匹配网址没有文件扩展名

时间:2011-05-31 20:36:24

标签: regex replace preg-match

我想要一些与以下网址相匹配的帮助。

/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个正则表达式 第一个应该是这样的:^ /([a-zA-Z0-9 _] +)(/)?(。*)?$ 第二个捕获直接文件名“/filename.php”或“/filename.php/create/user” 所以我可以重定向到unknown.php

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

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

如果有人可以帮我处理两个很棒的正则表达式。

2 个答案:

答案 0 :(得分:1)

当你拥有的只是一把锤子......

虽然这可能可以使用正则表达式来解决,但它可能是该作业的错误工具,除非您有使用正则表达式的约束。

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

答案 1 :(得分:1)

如果您想匹配这些.php个案例,可以试试这个:

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

请参阅Regexr

如果你想避免这些情况,试试这个:

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

请参阅Regexr

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