Php 从两种不同的url格式中提取数字的单个正则表达式?
我试图创建一个正则表达式,我可以使用它从PHP函数中的两个不同URL提取数字。这些URL的格式为:Php 从两种不同的url格式中提取数字的单个正则表达式?,php,regex,Php,Regex,我试图创建一个正则表达式,我可以使用它从PHP函数中的两个不同URL提取数字。这些URL的格式为: /t/2121/title/ 及 我不擅长正则表达式,并且已经尝试了以下方法和它的许多变体: #^/t/(\d+?)/|/top(\d+?)\.html/#i 这没有任何作用,在阅读了许多关于正则表达式的网站和教程后,我仍然完全不知所措。是否可以创建一个正则表达式,允许我在不考虑输入的url格式的情况下增加数字?如果您只需要t之后的第一个数字,而不考虑中间的/,类似的操作可能会起作用:\t/?
/t/2121/title/
及
我不擅长正则表达式,并且已经尝试了以下方法和它的许多变体:
#^/t/(\d+?)/|/top(\d+?)\.html/#i
这没有任何作用,在阅读了许多关于正则表达式的网站和教程后,我仍然完全不知所措。是否可以创建一个正则表达式,允许我在不考虑输入的url格式的情况下增加数字?如果您只需要
t
之后的第一个数字,而不考虑中间的/
,类似的操作可能会起作用:\t/?(\d+)\I
编辑:
示例:我能够让这个regexp匹配两种类型的url格式:
#^/(?:(?:t/)|(?:top))(\d+)(?:(?:\.html)|(?:/))#i
如果有人有一种更有效的方法来执行相同的regexp,我很乐意听到它。如果你有这些URL中的任何一个,你可以使用这个表达式。您的号码应存储在第二个位置:
#^/t(op|/)(\d+)(\.html|/.*)#i
URL中是否会有你不关心的数字?如果没有,您可以通过捕获数字并忽略其余数字来保持简单:
#(\d+)#
Regex仅提取数字,同时检查url是否与接受的格式匹配:
^\/t(?:\/(\d+)\/[a-z-]+\/?\124; op(\d+)\.html)$\35; i
编辑:分两组捕获
此处解释演示:
变体#2:在同一组中捕获
#^\/t(?|\/(\d+)\/[a-z-]+\/?$| op(\d+)\.html$)\i
此处演示说明:看起来这是您的答案:
[^\d]*(\d*)。
不会耍花招吗?我道歉。我输入的第二个url格式不正确。我对问题进行了编辑,以包含我正在使用的正确格式。我建议您不要将其作为一个正则表达式进行编辑,除非您有非常具体的原因必须这样做。为了清楚起见,把这两项任务分开。我写问题时把事情搞砸了。第二个url的格式是/top2121.htmlwell如果您只需要数字,并且这些是uri中唯一的数字,那么只需使用regex for/\d+/
就可以了,因为这可以由用户提交,我想匹配数字,但也要确保提交的url是有效的。谢谢/但是bla21051.html不应该工作。根据问题,它不是有效的url结构。还有一个原因是我们把数字限制在4或5吗?我宁愿不限制它们。这个论坛已经有超过10万个主题。这正是我所需要的!也谢谢你的网站。学习和测试regexp的绝佳场所!我刚刚意识到上面的regexp将在不同的索引中进行匹配。这将是/t/1231/asdas/中的第一个匹配项,也是/top1231.html中的第二个匹配项。是否有任何方法可以对其进行返工,使其成为相同的索引,而不考虑匹配的模式?
#(\d+)#