用于拆分URL的PHP​​代码

时间:2014-02-26 15:24:14

标签: php regex

在以下网址

http://www.example.com/usa-florida-1234

我可以在网址中将3个部分拆分为美国,佛罗里达和1234 ??

我只需要像

的查询字符串方法那样执行此操作

示例内容赞

我的内容在USA城市florida发布,邮政编码为1234

如何在-破折号

中拆分网址

喜欢

<?php
$country = // What to keep here?
$city =  // What to keep here?
$code = // What to keep here?
?>

我的内容在<?php echo $country; ?>城市<?php echo $city; ?>发布,邮政编码为<?php echo $code; ?>

由于

6 个答案:

答案 0 :(得分:4)

list($country, $city, $code) =
    explode('-', ltrim(parse_url($url, PHP_URL_PATH), '/'));

这里不需要正则表达式。

如果路径包含更多部分,country最终将会出现一些不需要的路径部分。

$country = end(explode('/', $country));

答案 1 :(得分:1)

您可以使用:

$arr = parse_url("http://localhost/test/usa-florida-1234");
print_r(explode('-', preg_replace('#^.*?/([^/]+)$#', '$1', $arr['path'])));

输出:

Array
(
    [0] => usa
    [1] => florida
    [2] => 1234
)

答案 2 :(得分:1)

<?php

preg_match('|http://www.example.com/(.*)-(.*)-(.*)|', 'http://www.example.com/usa-florida-1234', $matches);

print_r($matches);


$country = $matches[1];
$city =  $matches[2];
$code = $matches[3];

<强>更新

正则表达式中的每个字符要么被理解为具有特殊含义的元字符,要么被理解为具有字​​面含义的常规字符。

该模式由一系列原子组成。最简单的原子是文字,但是匹配原子的模式的分组部分将需要使用using()作为元字符。

当您匹配括号内的模式时,您可以使用$ 1,$ 2,...或\ 1 \ 2中的任何一个...(取决于匹配器!)以后引用先前匹配的模式。

在上面的示例中:

|(管道) - 在上面的例子中定义了模式的开始和结束

() - 两个元字符()模式的分组部分

.(点)=元字符;匹配任何单个字符

*(星号)=元字符,量词;定义允许发生前一个元素(字符或组,子表达式)的频率

考虑到这一点:

(.*)解析为匹配以供稍后参考由任何出现零次或多次的字符组成的组

并且:

|http://www.example.com/(.*)-(.*)-(.*)|

等于匹配:

包含字符串http://www.example.com/的字符串文本中出现的任何字符后跟任意字符在-字符之前的零次或多次,而不是在{{1之前的任何字符零次或多次之后}字符后跟任意字符零次或多次。

答案 3 :(得分:0)

如果以该格式预期使用所有URL,则可以在那里使用explode()。

$url = "http://www.example.com/usa-florida-1234";
$parts = explode('-', $url);
$country = $parts[0];
$city = $parts[1];
$code = $parts[2];

答案 4 :(得分:0)

您首先需要从您的网址('usa-florida-1234')获取路径。 然后你需要用破折号字符分割它。

对于第一部分,您可以使用parse_url。 你会发现它返回一个以'/'开头的字符串。你需要修剪它。 接下来,您可以使用explode

$urlParts = parse_url('http://www.testdomain.com/usa-florida-1234');
$urlPath = ltrim($urlParts['path'], '/');
$addressParts = explode('-', $urlPath);
$country = $addressParts[0];
$city = $addressParts[1];
$code = $addressParts[2];

您还应检查数组中是否有三个split返回的字符串。一些错误检查总是很好。

更好的解决方案是使用定义路径的MVC库

'addressRoute' => '/{country}-{state}-{id}'

和他们的处理程序

function addressRoute($country, $state, $id) {
}

lots上有discussions subject

答案 5 :(得分:0)

pathinfo并从数组中获取基本名称

  <?php
    $var="http://www.testdomain.com/usa-florida-1234";
    $arr=pathinfo($var);
    echo $arr['basename'];
    $arr=explode("-",$arr['basename']);
    print_r($arr);

输出:

Array
(
    [0] => usa
    [1] => florida
    [2] => 1234
)