从两种不同的 url 格式中提取数字的单个正则表达式?
Posted
技术标签:
【中文标题】从两种不同的 url 格式中提取数字的单个正则表达式?【英文标题】:Single regular expression that extracts a number from two different url formats? 【发布时间】:2013-01-22 03:08:53 【问题描述】:我正在尝试创建一个正则表达式,可用于从 php 函数中的两个不同 url 中提取数字。这些网址的格式是:
/t/2121/title/
和
/top2121.html
我不擅长正则表达式,并且已经尝试过以下及其许多变体:
#^/t/(\d+?)/|/top(\d+?)\.html/#i
这并没有做任何事情,在阅读了许多有关正则表达式的网站和教程后,我仍然完全不知所措。有没有我可以创建的正则表达式允许我添加数字而不管输入的 url 格式是什么?
【问题讨论】:
看起来这是你的答案:***.com/questions/6604455/…[^\d]*(\d*).*
不会成功吗?
我很抱歉。我错误地输入了第二种 url 格式。我编辑了问题以包含我正在使用的正确格式。
我建议您不要将其作为一个正则表达式来执行,除非您有非常具体的理由必须这样做。为清楚起见,将这两个任务分开。
【参考方案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+)#
【讨论】:
以上是关于从两种不同的 url 格式中提取数字的单个正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章