使用 Regex 匹配多个可能的值,除非忽略的值匹配

Using Regex to match on multiple possible values unless ignored values match

我正在尝试使用记事本++和正则表达式找到一种从我的日志文件中提取信息的更好方法,以便我可以查看任何关注的内容(查找 500 错误和 php 尝试等)。

目前我有以下内容;

^((?!bot.php)|(?!baidu)|(?!bingbot)|(?!facebookexternalhit)|(?!Curious+George)|(?!wpad.dat)).(php.$|select.$|/wp.$|wordpress.$|\s500\s.$|/Rejected.*$)

据我所知,它应该忽略具有第一个值的行(我想忽略的各种机器人和我不关心的代理尝试) 但它随后会匹配其他值(php、wordpress、500 个错误并被 urlscan 拒绝),但是当它在第二组上匹配时,它似乎无法忽略第一组中的值。

(在有人问我为什么要在服务器日志中寻找 PHP 之前,我是 运行 .net 上的一个 windows 服务器,所以任何 .PHP 要么是 headers 来自机器人,要么是黑客试图找到 non-existent 页)

在记事本++中试试这个表达式

(?-s)^(?=(?:.(?!baidu|bot\.php))*?$)(?=.*?(?:\.php|select\.|500)).*?$

其中 (?!baidu|bot\.php) 包含备用黑名单(您想忽略的行) (?:\.php|select\.|500) 包含您要匹配的行的白名单。

只匹配白名单匹配的线路,不匹配黑名单的线路

例如仅匹配以下 4 行中的第 2 行和第 4 行:

/randomPage.htm randomBrowser 200 
/access.php randomBrowser 200 
/access.php baidu 200 
/randomPage.htm randomBrowser 500