从URL字符串获取令牌

时间:2018-07-25 10:03:58

标签: regex powershell url token

我正在尝试从URL字符串获取令牌。

示例网址(显然已更改为不发布敏感内容):

https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb&parameter2=some_value

我正在尝试制作仅返回令牌的正则表达式。

https://example.com/file.extention?validation.token= kDa9udKcYp1Wo2ay5Lbb &parameter2 = some_value

我首先搜索“ token =“,然后将其从结果中排除。为此,我尝试了不匹配的组和其他解决方案。但是我目前正在寻找环顾四周。然后我匹配要返回的令牌。这似乎正在工作。我的问题是,URL可能包含或可能不包含更多参数。因此,我再次环顾四周,说令牌将在其后跟一个“&”,或者是(行/字符串)“ $”的结尾。这是麻烦的部分。

我当前的正则表达式:

(?<=token\=)([\w\d\S]*)(?=[\&|$])
Flags: gm (as of now)

See it in action

如链接所示,它可以工作。当URL字符串仅包含令牌时,它将不起作用。

令牌为20个字符,所以我想出了以下变体:

(?<=token\=)([\w\d\S]{1,20})
Flags: gm (as of now)

See it in action

这正常工作,但是我正在使工作流程自动化,并且令牌在将来的更新中可能会更改,所以我希望进行尽可能少的维护。

我不能在“ token =”和(“&”或“ $”结尾((line | string))之间的字符串搜索吗?

编辑

URL中也可能有#anchors,如果我只是检查下一个&符号,则可能无意地将其包含在令牌中。另外,按照某些建议的操作,它可以跨越多行,如HERE所示。

5 个答案:

答案 0 :(得分:1)

此功能使用UriHttpUtility类内置于.NET / PowerShell:

$url0 = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb';
$url1 = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb&parameter2=some_value';

[System.Web.HttpUtility]::ParseQueryString(([uri]$url0).Query)['validation.token'];
[System.Web.HttpUtility]::ParseQueryString(([uri]$url1).Query)['validation.token'];

答案 1 :(得分:0)

您也可以进行简单拆分:

$str = 'https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb&parameter2=some_value'
(($str -split '&' -match 'token') -split '=')[1]

答案 2 :(得分:0)

在否定的character class #中,您不能匹配与号或[^&#]+

(?<=token\=)([^&#]+)

答案 3 :(得分:0)

只是为了kix ..

$url = "https://example.com/file.extention?validation.token=kDa9udKcYp1Wo2ay5Lbb&parameter2=some_value"
(ConvertFrom-StringData ([uri]$url).Query.Substring(1).Replace("&", [environment]::NewLine))['validation.token']

答案 4 :(得分:0)

关于您自己的尝试的一些评论:

  • 字符类[\w\d\S]-\w(文字字符)包含数字,因此\d是多余的。此外,&无空格\S匹配。
  • 字符类[\&|$]-无需在字符类中转义&,而在字符类中转义$则表示文字字符$-不是 end线

尝试

token=(\w+)(?=&|$)

这将为您提供捕获组1中的令牌。我看不到您提到它,但是我假设令牌只能由字母和数字组成。

与UnbearableLightness建议相似,但效果要好10倍左右。 (性能可能不是问题,但是...)

See it here at regex101