PHP正则表达式获取url段
有人能帮忙吗 我想获取url的前两段 例如,url可以如下所示PHP正则表达式获取url段,php,regex,Php,Regex,有人能帮忙吗 我想获取url的前两段 例如,url可以如下所示 /catalog/category-1 或 我现在的正则表达式看起来像这样 /(\/catalog\/.*?)\// 这适用于长url,但不适用于第一个示例。不要使用正则表达式解析url。使用内置功能 从该函数中获取路径组件后,可以使用该函数根据斜杠分隔URL的各个部分 <?php $url = "http://example.com/this/that/other?page=1"; $parts = parse_ur
/catalog/category-1
或
我现在的正则表达式看起来像这样
/(\/catalog\/.*?)\//
这适用于长url,但不适用于第一个示例。不要使用正则表达式解析url。使用内置功能 从该函数中获取路径组件后,可以使用该函数根据斜杠分隔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 );
?>
试一试
编辑:
正如@Crisp在评论中指出的,为了防止第一个\u段为空,
trim
在分解之前先修剪字符串。首先,使用parse\u url将url拆分为主机、端口、路径和查询字符串
然后,在路径上使用此正则表达式:
<?php
preg_match('#^/([^/]+)/([^/]+)#i', $path, $matches);
?>
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 /
解析url不会起作用。所有片段都将保留在路径部分的path
@matheusaezevedo如何explode
?@eisberg正是我的答案(:永远不要使用split()
-尽管它的名称无害,但它已被弃用并使用posix regexps。如果您想使用正则表达式进行拆分,请使用preg_split
,否则使用explode
@neowerk:除了“但是我想要!!!”之外,还有什么原因吗?regexp不是分割路径段的首选方法;但是它们可以从单个段提取数据。是的,就是这样!非常感谢!我猜$url[0]
将是一个空字符串,因为前导斜杠。$url[0]
将是一个空字符串“
在OP中使用url。可能添加trim
或ltrim
。例如$url=explode('/',trim($url,'/'))
谢谢你的帮助和详细的解释。我不擅长正则表达式。当使用
作为分隔符时,你不必避开前斜杠。@ThiefMaster啊,是的,我最初发布的分隔符是/
,现在更新了。@neowerk on stackoverflow通过向上投票任何有用的答案和acc来表示感谢这是最有用的答案。
$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 /