【问题标题】:PHP code to split the URL用于拆分 URL 的 PHP 代码
【发布时间】:2014-02-26 15:24:13
【问题描述】:

在以下网址中

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

我可以将 URL 中的 URL 拆分为 USA、Florida 和 1234 的 3 部分吗??

我只需要像查询字符串方法一样这样做

样例内容喜欢

我发布的内容是USAflorida所在的城市,邮编是1234

如何在- 破折号内拆分网址

喜欢

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

我发布的内容是&lt;?php echo $country; ?&gt;&lt;?php echo $city; ?&gt;城市,邮编是&lt;?php echo $code; ?&gt;

谢谢

【问题讨论】:

  • 我通常没有机会在这里修复某人的第 105 个问题中的代码格式...

标签: php regex


【解决方案1】:
list($country, $city, $code) =
    explode('-', ltrim(parse_url($url, PHP_URL_PATH), '/'));

这里不需要正则表达式。

如果路径包含更多部分,country 会以一些不想要的路径部分结束。

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

【讨论】:

  • 我喜欢聪明的解决方案,但这个似乎在一行代码中做的太多了。不过,您可能会变得过于冗长(请参阅我的回答)。
  • 一切都好,但是当我尝试以 localhost/test/usa-florida-1234 运行时,我得到了国家/地区的“测试/美国”
  • @lock 我没有意识到路径中还有更多部分,而不仅仅是您需要的信息;这确实改变了答案。我会更新的。
【解决方案2】:

你可以使用:

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

输出:

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

【讨论】:

【解决方案3】:
<?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];

更新:

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

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

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

在上面的例子中:

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

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

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

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

记住这一点:

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

还有:

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

等于匹配:

字符串文本中出现的任何情况,该字符串包含字符串 http://www.example.com/ 后跟任意字符零次或多次在 - 字符之前,然后再后跟任意字符零次或多次之前 - 字符后跟任意字符字符零次或多次。

【讨论】:

  • 查看其他答案。看来Lock先生想从某个URL中提取国家、城市和代码。
  • “查看其他答案...” 并不是对您的答案的真正解释。您的帖子被标记为低质量,因为它不包含任何解释。 您的 答案如何解决 OP 遇到的问题。通过解释你做了什么以及它如何解决问题,你更有可能帮助未来的访问者解决这个问题。
【解决方案4】:

如果使用的所有 URL 都应采用该格式,您可以在此处使用 explode()。

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

【讨论】:

  • 推荐爆丸的答案!
【解决方案5】:

您首先需要从您的 URL ('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) {
}

在这个subject 上有lotsdiscussions

【讨论】:

    【解决方案6】:

    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
    )
    

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多