【问题标题】:Sanitize url path with regex使用正则表达式清理 url 路径
【发布时间】:2021-07-29 09:20:46
【问题描述】:

我正在尝试从以下元素中清理 url 路径

  • ids (1, 14223423, 24fb3bdc-8006-47f0-a608-108f66d20af4)
  • 文件名(things.xml、doc.v2.final.csv)
  • 域(包含在文件名下)
  • 电子邮件 (foo@bar.com)

示例:

/v1/upload/dxxp-sSy449dk_rm_1debit_A_03MAY21.final.csv/email/foo@bar.com?who=knows

期望的结果:

/upload/email

我有一些有用的东西......但我并不自豪(用 Ruby 编写)

# Remove params from the path (everything after the ?)
route = req.path&.split('?')&.first
# Remove filenames with singlular extentions, domains, and emails
route = route&.gsub(/\b[\w-]*@?[\w-]+\.[\w-]+\b/, '')
# Remove ids from the path (any string that contains a number)
route = "/#{route&.scan(/\b[a-z_]+\b/i)&.join('/')}".chomp('/')

我不禁认为这可以简单地用\/([a-z_]+)\/? 之类的东西来完成,但是\/? 太松散了,\/ 太严格了。

【问题讨论】:

    标签: regex ruby


    【解决方案1】:

    也许您可以删除以/ 开头并且至少包含一个点或数字的部分。

    用空字符串替换匹配项。

    /[^/\d.]*[.\d][^/]*
    

    Rubular regex demo

    • / 匹配正斜杠
    • [^/\d.]* 匹配除 /. 或数字以外的任何字符 0+ 次
    • [.\d] 匹配 . 或数字
    • [^/]* 匹配除 / 之外的任何字符 0+ 次

    输出

    /upload/email
    

    【讨论】:

      【解决方案2】:

      在 Ruby 中,您可以使用一些代码以类似的方式简化检查:

      text = text.split('?').first.split('/').select{ |x| not x.match?(/\A[^@]*@\S+\z|\d/) }.join("/")
      

      请参阅Ruby demo。请注意这种方法在多大程度上简化了电子邮件和数字检查。

      详情

      • text.split('?').first - 用? 分割字符串并获取第一部分
      • .split('/') - 与 / 拆分为子部分
      • .select{ |x| not x.match?(/\A[^@]*@\S+\z|\d/) } - 只保留不匹配的项目 \A[^@]*@\S+\z|\d 正则表达式:\A[^@]*@\S+\z - 字符串开头,除@ 之外的任何零个或多个字符,一个@ 字符,然后是任何零个或多个非空格字符和字符串结尾,或数字
      • .join("/") - 使用 / 连接生成的项目。

      【讨论】:

        【解决方案3】:

        所以,我认为这里最好使用允许列表,而不是阻止列表。似乎说“我们只保留带有字母和下划线的单词”更容易预测。

        # Keep path w/o params
        route = req.path.to_s.split('?').first
        # Keep words that only contain letters or _
        route = route.split('/').keep_if { |chunk| chunk[/^[a-z_]+$/i] }
        # Put the path back together
        route = "/#{route.join('/')}".chomp('/')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-14
          • 2018-01-23
          • 2022-08-11
          • 1970-01-01
          相关资源
          最近更新 更多