正则表达式用于检测包含但有序的单词


Regex for detecting a word enclosed but in order

>我有一个正则表达式,需要匹配特定的 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)]会匹配除(sea等以外的任何内容

溶液

您可以使用断言背后的外观作为

^.*(?<!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