从两种不同的url格式中提取数字的单个正则表达式


Single regular expression that extracts a number from two different url formats?

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

/t/2121/title/

/top2121.html

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

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

这没有任何作用,在阅读了许多关于正则表达式的网站和教程后,我仍然完全不知所措。有没有一个我可以创建的正则表达式可以让我在不考虑输入的url格式的情况下增加数字?

Regex只提取数字,同时检查url是否与可接受的格式匹配:

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

演示说明如下:http://regex101.com/r/dO5dI4

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

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

演示说明如下:http://regex101.com/r/cG9vC3

如果您只想要t之后的第一个数字,而不考虑其间的/,那么这样的东西可能会起作用:#t/?('d+)#i

编辑:

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

我能够得到这个regexp来匹配两种类型的url格式:

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

如果有人有更有效的方法来执行相同的regexp,我很乐意听到。

如果你得到了其中一个URL,你可以使用这个表达式。您的号码应存储在第二个位置:

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

URL中会有你不关心的数字吗?如果没有,你可以通过捕捉数字而忽略其他数字来保持简单:

#('d+)#