gpt4 book ai didi

regex - 如何强制正则表达式捕获最大的匹配项?

转载 作者:行者123 更新时间:2023-12-05 03:10:53 25 4
gpt4 key购买 nike

我正在尝试防止对网站的恶意注入(inject)。我这样做的方法是创建一个函数,该函数可以“修剪” URL 中可能使其非法的任何额外部分。

为了使 URL 合法,它必须遵循以下格式:

(anything)(one of several specificied path predecessors)(specific page)

例如,假设您的路径前辈是...

["services", "services/city", "specials", "specials/limited/"]

一些示例输入和结果:

www.fake.com/services/home -> (legal, no trim) -> www.fake.com/services/home

www.fake.com/services/city/nyc -> (legal, no trim) -> www.fake.com/services/city/nyc

www.fake.com/services/city/nyc/fakeinjection.txt -> (illegal) -> www.fake.com/services/city/nyc

www.fake.com/specials/limited/california/fake/fake/fake.bak -> (illegal) -> www.fake.com/specials/limited/california

所以我写了下面的正则表达式只匹配输入URL的合法部分:

/.*(services|services\/city|specials|specials\/limited)\/[^\/]*/gi

这个问题是它并不总是捕获最大可能的匹配项,因此它会无意中修剪掉太多。例如:

www.fake.com/services/city/nyc -> (应该是合法的,不应该修剪) ->www.fake.com/services/city/

我想我明白为什么会这样。我相信它正在捕获它看到的第一件事并与之匹配。但是我需要强制它尽可能地取最大的一个,只在必要时进行修剪。我认为“贪婪”标志会帮助做到这一点,但事实并非如此。

有人可以提供一些解决方案的指导吗?将不胜感激。

(PS。如果有区别,我使用的语言是 javascript)

最佳答案

如果你有一个 unanchored 交替组,你应该把最长的交替组放在第一位。在任何 NFA 正则表达式中,匹配的第一个分支停止处理交替组并继续处理后续模式。

所以,你可以使用

/.*(services\/city|specials\/limited|services|specials)\/[^\/]*/
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^

参见 regex demo

如果您使用可选组手动创建模式以减少回溯,您可以进一步增强此列表:

/.*(services(?:\/city)?|specials(?:\/limited))\/[^\/]*/

甚至

/.*(s(?:ervices(?:\/city)?|pecials(?:\/limited)))\/[^\/]*/

关于regex - 如何强制正则表达式捕获最大的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com