【问题标题】: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

【讨论】:

  • 使用PHP_URL_PATH 作为第二个参数,parse_url 返回带有路径的字符串而不是数组。示例:3v4l.org/ZgVAS
  • 很高兴添加卡西米尔!编辑我的答案。
【解决方案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/

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 2016-11-07
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 2021-04-19
    相关资源
    最近更新 更多