>我有一个正则表达式,需要匹配特定的 url 并基于该 url 加载一些配置。基本上我所拥有的是/*[^(search)].php/
这个正则表达式需要匹配最后.php的每个 url,但参数可能存在 (something.pgp?t=19)
除了具有search.php
的 url
例如
1. http://www.example.com/discuss/viewtopic.php?t=19
2. http://www.example.com/discuss/viewforum.php?f=8
3. http://www.example.com/discuss/search.php?f=8
在上述三个 url 中,正则表达式需要能够匹配 1 和 2,但不能匹配 3。非常感谢任何帮助。
编辑但是,它不应与不包含.php的任何其他 url 匹配。 www.example.com/something
不应匹配。
试试这个:
/.+?(?<!search)'.php(?<params>.*)/
关键是非贪婪的"任何东西".+?
:它一个接一个地爬上字符串,总是检查"看你身后,看不到'搜索',然后是.php:(?<!search)'.php
,然后是命名组,这是可选的查询字符串参数。
请注意,这个简单的正则表达式非常宽松,并假设仅.php表示"php URL" - 您可能会得到疯狂复杂的验证 URL。
只需使用两个不同的位置(确保search.php
在一般*.php
之前)
location ~ /search'.php$ {
# config for phusion-passenger
}
location ~ '.php$ {
# config for php-fpm
}
Nginx 在搜索匹配项时会去除请求参数,因此您不必关心它们。
/*[^(search)].php/
中的问题
-
[^ ]
否定字符类所以这里的
[^(search)]
会匹配除(
或s
或e
或a
等以外的任何内容
溶液
您可以使用断言背后的外观作为
^.*(?<!search'.php)'?([^=]=)+'d+$
将匹配 1 和 2
例 : http://regex101.com/r/bJ3vG1/4
它的作用是什么?
(?<!search'.php)
负面的回头看。 断言正则表达式不是由search.php
'?[^=]='d+
匹配参数
编辑
如果参数部分是可选的,则更长的正则表达式将达到目的
.*(?<!search'.php)'?([^=]=)+'d+$|^[^?]*(?<!search'.php)$
例 : http://regex101.com/r/bJ3vG1/3