PCRE。如何获取网址的最后一部分

时间:2017-07-23 19:16:36

标签: php regex preg-replace pcre

有一个这种网址

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');

3 个答案:

答案 0 :(得分:5)

您不需要正则表达式

这样做的方法不止一种。

查看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

答案 1 :(得分:1)

为何选择正则表达式?

$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);

答案 2 :(得分:1)

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/