【问题标题】:Single regular expression that extracts a number from two different url formats?从两种不同的 url 格式中提取数字的单个正则表达式?
【发布时间】:2013-01-22 03:08:53
【问题描述】:

我正在尝试创建一个正则表达式,可用于从 PHP 函数中的两个不同 url 中提取数字。这些网址的格式是:

/t/2121/title/

/top2121.html

我不擅长正则表达式,并且已经尝试过以下及其许多变体:

#^/t/(\d+?)/|/top(\d+?)\.html/#i

这并没有做任何事情,在阅读了许多有关正则表达式的网站和教程后,我仍然完全不知所措。有没有我可以创建的正则表达式允许我添加数字而不管输入的 url 格式是什么?

【问题讨论】:

  • 看起来这是你的答案:stackoverflow.com/questions/6604455/…
  • [^\d]*(\d*).* 不会成功吗?
  • 我很抱歉。我错误地输入了第二种 url 格式。我编辑了问题以包含我正在使用的正确格式。
  • 我建议您不要将其作为一个正则表达式来执行,除非您有非常具体的理由必须这样做。为清楚起见,将这两个任务分开。

标签: php regex


【解决方案1】:

正则表达式仅提取数字,同时检查 url 是否与可接受的格式匹配:

#^\/t(?:\/(\d+)\/[a-z_-]+\/?|op(\d+)\.html)$#i 编辑:2组捕获

在此处解释演示:http://regex101.com/r/dO5dI4

变体 #2: 在同一组中捕获

#^\/t(?|\/(\d+)\/[a-z_-]+\/?$|op(\d+)\.html$)#i

在此处解释演示:http://regex101.com/r/cG9vC3

【讨论】:

  • 谢谢。 /blabla21051.html 不应该工作。根据问题,它不是有效的 url 结构。还有我们将数字限制为 4 或 5 的原因吗?我宁愿根本不限制它们。这个论坛已经有超过 10 万个主题。
  • 太棒了,这正是我所需要的!也感谢网站。学习和测试正则表达式的好地方!
  • 我刚刚意识到上面的正则表达式将在不同的索引中完成匹配。这将是 /t/1231/asdas/ 中的第一个匹配项和 /top1231.html 中的第二个匹配项。有没有办法对其进行返工,使其成为相同的索引,而不管匹配的模式如何?
【解决方案2】:

如果您只想要t 之后的第一个数字而不管/ 之间的关系,这样的事情可能会起作用:#t/?(\d+)#i

编辑:

示例:http://codepad.viper-7.com/0z3ee0

【讨论】:

  • 我写这个问题的时候搞砸了。第二个 url 格式为 /top2121.html
  • 好吧,如果你想要的只是数字,而这些是 uri 中唯一的数字,那么只需正则表达式 /\d+/
  • 因为这可以是用户提交的,所以我想匹配数字,但也要确保提交的 url 是有效的。
【解决方案3】:

我能够让这个正则表达式匹配两种类型的 url 格式:

#^/(?:(?:t/)|(?:top))(\d+)(?:(?:\.html)|(?:/))#i

如果有人有更有效的方式来执行相同的正则表达式,我很想听听。

【讨论】:

    【解决方案4】:

    如果您有其中任何一个 URL,则可以使用此表达式。您的号码应该存储在您的第二个位置:

    #^/t(op|/)(\d+)(\.html|/.*)#i
    

    【讨论】:

      【解决方案5】:

      网址中是否会有您不关心的数字?如果没有,您可以通过捕获数字并忽略其余部分来保持简单:

      #(\d+)#
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2018-06-23
        • 2012-01-16
        • 1970-01-01
        • 2017-05-27
        • 2011-07-24
        • 1970-01-01
        相关资源
        最近更新 更多