Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从两种不同的url格式中提取数字的单个正则表达式?_Php_Regex - Fatal编程技术网

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

Php 从两种不同的url格式中提取数字的单个正则表达式?,php,regex,Php,Regex,我试图创建一个正则表达式,我可以使用它从PHP函数中的两个不同URL提取数字。这些URL的格式为: /t/2121/title/ 及 我不擅长正则表达式,并且已经尝试了以下方法和它的许多变体: #^/t/(\d+?)/|/top(\d+?)\.html/#i 这没有任何作用,在阅读了许多关于正则表达式的网站和教程后,我仍然完全不知所措。是否可以创建一个正则表达式,允许我在不考虑输入的url格式的情况下增加数字?如果您只需要t之后的第一个数字,而不考虑中间的/,类似的操作可能会起作用:\t/?

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

/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+)#