【问题标题】:Regex to match JSON Web Token within URL正则表达式匹配 URL 中的 JSON Web 令牌
【发布时间】:2016-06-13 16:40:46
【问题描述】:

我需要一些帮助来完善这个正则表达式,以便能够使用 PHP 识别 URL 字符串中的 JWT 令牌。这可以很好地匹配令牌,但如果我附加另一个 URI 段,则不会。

到目前为止的正则表达式:

/[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.([a-zA-Z0-9\-_]+)$/

适用于的网址:

http://not.website.com/**eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ**

网址无效(请注意末尾的附加段)

http://not.website.com/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ/additional/segments

预期的匹配应如下所示:

http://not.website.com/**eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ**/additional/segments

【问题讨论】:

  • 试着去掉最后一美元。
  • 如果该 jwt 旨在成为 url 中的第一个“查询”段,那么您实际上不需要任何正则表达式

标签: php regex jwt


【解决方案1】:
/(http:\/\/[a-zA-Z0-9\-_\.]+)(\/[a-zA-Z0-9\-_\.]+)(\/[a-zA-Z0-9\-_]*)*$/

您的令牌将从第二组中提取 见https://regex101.com/r/fO9dR4/1

【讨论】:

    【解决方案2】:

    你可以用这种方式修改你的正则表达式

    [a-zA-Z0-9-_]+?.[a-zA-Z0-9-_]+?.([a-zA-Z0-9-_]+)[/a-zA -Z0-9-_]+?$

    添加

    [/a-zA-Z0-9-_]*?$

    之前

    (可选:(*?)所以额外的正斜杠和字符将被覆盖在上面的模式中)

    【讨论】:

    • 我相信它是\. 因为普通的. 表示除行终止符之外的任何字符。但是\. 的字面意思是“。”
    【解决方案3】:

    根据这些 URL 字符串出现的位置(文本或独立),您可以simply do

    ^https?://.+?/(?P<token>[^/\n\r]+)
    

    PHP 中,这将是:

    $string = 'http://not.website.com/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ/additional/segments';
    $regex = '~                     # delimiter
              ^https?://.+?/        # match http:// or https:// + anything up to a / lazily
              (?P<token>[^/\n\r]+)  # capture everything that is not a / or newline (for this demo) to the group "token"
              ~x';                  # delimiter
    preg_match($regex, $string, $match);
    echo $match["token"];           # access your token in the $match array
    // output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
    

    a demo on ideone.com

    【讨论】:

    • 非常感谢!完美运行
    • @MikeMiller:很高兴能得到任何帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多