0

我的 HTTP 标头中有 cookie,如下所示:

Set-Cookie: frontend=ovsu0p8khivgvp29samlago1q0; adminhtml=6df3s767g199d7mmk49dgni4t7; external_no_cache=1; ZDEDebuggerPresent=php,phtml,php3

我需要提取前端之后的 26 个字符串(例如ovsu0p8khivgvp29samlago1q0)。以下正则表达式与我匹配:

(?<=frontend=)(.*)(?=;)

但是,我使用的是清漆缓存,只能使用正则表达式替换。因此,要提取该 cookie 值(26 个frontend字符串),我需要匹配与该模式不匹配的所有字符(因此我可以将它们替换为'')。

我已经做了相当多的谷歌搜索,但到目前为止还一片空白。我试过以下

  • 匹配与我想要的模式不匹配的字符:[^((?<=frontend=)[A-Za-z0-9]{26}(?=;))]匹配随机字符,包括我想要保留的字符

如果有人能指出我正确的方向,或者指出我可能出错的地方,我将不胜感激。

4

3 回答 3

2

Set-Cookie 响应头在 Varnish 中有点神奇,因为后端倾向于发送多个具有相同名称的头。这是 RFC 禁止的,但实际上是这样做的。

如果您使用的是 Varnish 3.0,您可以使用 Header VMOD,它可以解析响应并提取您需要的内容:

https://github.com/varnish/libvmod-header

于 2012-11-25T20:48:35.980 回答
1

使用正则表达式模式

^Set-Cookie:.*?\bfrontend=([^;]*)

并且“前端之后的 26 个字符串”将成组1(通常在替换字符串中称为$1

于 2012-11-24T01:09:59.923 回答
1

您可以控制替换字符串吗?如果是这样,您可以使用 Ωmega 的答案,并$1在替换字符串中使用将frontend值写回。

否则,你可以使用这个:

^Set-Cookie:.*(?!frontend=)|(?<=frontend=.{26}).*$

这将匹配从字符串开头到frontend=遇到的所有内容。或者它将匹配frontend=左侧正好有 26 个字符的所有内容,直到字符串末尾。如果这 26 个字符是可变长度的,那么它会变得更加复杂,因为只有 .NET 支持可变长度的后视。

对于你的最后一个问题。让我们看看你的正则表达式:

[^((?<=frontend=)[A-Za-z0-9]{26}(?=;))]

好吧,首先,[^...]你试图用它来包围你的否定字符类,实际上并不是这样工作的。它仍然是一个字符类,因此它只匹配不在该类中的单个字符。但它变得更加复杂(我想知道为什么它完全匹配)。所以首先字符类应该由first ]关闭。此字符类匹配任何不是(, ?, <, =, ), 字母或数字的字符。然后将{26}应用于那个,所以我们试图找到其中的 26 个字符。然后(?=;)which 断言这 26 个字符后面跟着;. 现在是什么不应该工作。关闭)实际上应该抛出和错误。和决赛]将被解释为文字]

有一些正则表达式允许嵌套字符类(Java 可以)。在这种情况下,您只需拥有一个等同于[^a-zA-Z0-9(){}?<=;]. 但据我所知,Varnish 使用 PCRE,而在 PCRE 中,您的正则表达式根本不应该编译。

于 2012-11-24T01:13:15.343 回答