【问题标题】:pcre. How to get last part of urlpcre。如何获取网址的最后一部分
【发布时间】:2017-12-29 08:32:18
【问题描述】:
有一个这样的网址
https://example.com.ua/part1/part2/part3/product-123.html
如何用正则表达式得到product-123.html?
我试过这个:
echo
preg_replace('#/([a-zA-Z0-9_-]+\.html)$#','$1','https://example.com.ua/part1/part2/part3/product-123.html');
【问题讨论】:
标签:
php
regex
preg-replace
pcre
【解决方案1】:
你不需要正则表达式
有不止一种方法可以做到这一点。
查看parse_url()。
parse_url():此函数解析一个 URL 并返回一个关联数组,其中包含该 URL 的任何各种组件。
这将使您大部分时间到达那里,并且还会为您分离主机。然后,您只需使用 explode() 和 end() 爆炸到最后一部分。
$url = parse_url('http://example.com/project/controller/action/param1/param2');
$url['last'] = end(explode('/', $url[path]));
Array
(
[scheme] => http
[host] => example.com
[path] => /project/controller/action/param1/param2
[last] => param2
)
或者你可以像这样直奔主题:
$last = ltrim(strrchr(parse_url($url, PHP_URL_PATH), '/'), '/');
您也可以直接在 URL 上直接使用 explode() 和 end() 组合。 (如果你不需要 parse_url 的额外信息,它也会短很多)
$last = end(explode('/', $url));
你也可以像这样使用basename()
$url = "http://example.com/project/controller/action/param1/param2";
$last = basename($url);
// Output: param2
【解决方案2】:
为什么是正则表达式?
$str ="https://example.com.ua/part1/part2/part3/product-123.html";
Echo Substr($str, strrpos($str, "/")+1);
https://3v4l.org/rJiGL
Strrpos 找到最后一个/ 并返回位置。
这是一个 preg_replace,如果您必须使用正则表达式,它将起作用。
https://regex101.com/r/6zJwBo/1
$re = '/.*\//';
$str = 'https://example.com.ua/part1/part2/part3/product-123.html';
$subst = '';
$result = preg_replace($re, $subst, $str);
【解决方案3】:
preg_replace 仅替换您找到的内容。在这种情况下product-123.html。因此,您将 /product-123.html 替换为 product-123.html 并且 https://example.com.ua/part1/part2/part3 保持不变。
替换所有内容,只保留你想做的匹配
echo
preg_replace('#.*/([a-zA-Z0-9_-]+\.html)$#','$1','https://example.com.ua/part1/part2/part3/product-123.html');
虽然你不需要正则表达式来完成这项任务,如果你这样做了,使用preg_match 可能会更干净。
这是preg_match 方法:
preg_match('#[a-zA-Z0-9_-]+\.html$#', 'https://example.com.ua/part1/part2/part3/product-123.html', $match);
echo $match[0];
演示:https://3v4l.org/4o9RM
正则表达式演示:https://regex101.com/r/6dytu0/2/