如何从URL中提取ID?PHP正则匹配结果不符合预期求解
解决URL中ID提取的问题
你遇到的核心问题是正则表达式里的.*属于贪婪匹配——它会尽可能多地捕获字符,直到找到字符串中最后一个-,所以才会把-title-of-the也包含进去。另外还要注意:eregi函数在PHP 5.3之后就已经被废弃了,推荐使用更安全、功能更完善的preg_match系列函数。
下面给你两种可靠的解决方案:
方案1:精准匹配数字ID(推荐)
既然你的ID是纯数字,直接用\d+匹配一个或多个数字,这样既精准又不会出现贪婪问题:
$text = '/news/35555555555-title-of-the-article'; // 使用preg_match,正则匹配news/后的数字直到第一个- preg_match("#news/(\d+)-#", $text, $regs); echo $regs[1]; // 输出:35555555555
方案2:非贪婪匹配(适用于ID含非数字的情况)
如果ID可能包含字母或其他字符,只需要抓取第一个-之前的内容,可以用非贪婪模式.*?(注意必须用preg_match,eregi不支持非贪婪):
$text = '/news/35555555555-title-of-the-article'; preg_match("#news/(.*?)-#", $text, $regs); echo $regs[1]; // 输出:35555555555
补充说明
preg_match默认区分大小写,如果你的URL可能有大小写混合的情况,比如News/,可以在正则末尾加i修饰符:preg_match("#news/(\d+)-#i", $text, $regs)- 用
\d+的方式比通配符匹配效率更高,因为它只匹配数字,避免了不必要的字符扫描。
内容的提问来源于stack exchange,提问作者AlbaStar
相关产品推荐
相关产品推荐

