3

有人可以帮忙吗?

我想获取 url 的前两个部分,例如 url 看起来像这样

/catalog/category-1

或者

/catalog/category-1/filter/value

我目前的正则表达式看起来像这样......

/(\/catalog\/.*?)\//

这适用于长网址,但不适用于第一个示例。

4

4 回答 4

7

尝试

$url = explode('/', trim($url, '/'));
$first_segment = $url[0];
$second_segment = $url[1];

编辑:正如@Crisp 在评论中指出的那样,为了防止空的first_segment,trim你的字符串在你之前explode

于 2012-11-29T14:59:37.143 回答
5

不要使用正则表达式来解析您的 URL。使用内置parse_url()函数。

从该函数获取路径组件后,您可以使用该explode()函数根据斜杠拆分 URL 的各个部分。

<?php

$url = "http://example.com/this/that/other?page=1";

$parts = parse_url($url);

print 'Parts = ';
print_r($parts);

print 'Path = ' . $parts['path'] . "\n";

$path_components = explode( '/', $parts['path'] );
print "Path components = ";
print_r( $path_components );

?>

这给了你这个:

Parts = Array
(
    [scheme] => http
    [host] => example.com
    [path] => /this/that/other
    [query] => page=1
)
Path = /this/that/other
Path components = Array
(
    [0] => 
    [1] => this
    [2] => that
    [3] => other
)
于 2012-11-29T14:56:31.283 回答
1

Regex正如其他人所指出的那样,在这种情况下并不是最好的工具,但在这里它正在使用regex.

您的问题regex是您正在尝试匹配三个/,请改用否定:

$str1='/catalog/category-1';
$str2='/catalog/category-1/filter/value';

preg_match('#/[^/]*/[^/]*#',$str1,$match);
echo $match[0].;

preg_match('#/[^/]*/[^/]*#',$str2,$match);
echo $match[0];

输出:

/catalog/category-1
/catalog/category-1

解释:

/      # Match first /
[^/]*  # Match anything not a /
/      # Match second /
[^/]*  # Match anything not a /
于 2012-11-29T15:01:07.830 回答
0

首先,使用 parse_url 将 url 拆分为主机、端口、路径和查询字符串。

然后,在路径上使用这个正则表达式:

<?php
preg_match('#^/([^/]+)/([^/]+)#i', $path, $matches);
?>
于 2012-11-29T14:59:51.040 回答