如何匹配URL的最后一段(字符串)?

时间:2016-10-30 12:33:33

标签: php regex

我想用en添加/替换网址的最后一段(无论网址参数如何)

  • 如果最后一段不是enfa,则将en添加为最后一段。
  • 如果最后一个段落为enfa,请将其替换为en

以下是四个例子:

一:

$str = 'http://localhost:8000/search/fa?q=sth';

预期产出:

//=>    http://localhost:8000/search/en?q=sth

两个

$str = 'http://localhost:8000/search?q=sth';

预期产出:

//=>    http://localhost:8000/search/en?q=sth

$str = 'http://localhost:8000/search';

预期产出:

//=>    http://localhost:8000/search/en

$str = 'http://localhost:8000/search/fa';

预期产出:

//=>    http://localhost:8000/search/en

这也是我到目前为止所做的:

/\/(?:en|fa)(?=\??)/

php版本:

preg_replace('/\/(?:en|fa)(?=\??)/', '/en', Request::fullUrl())

如您所见,我的模式取决于enfa个关键字,当它们不存在时,它会失败。

1 个答案:

答案 0 :(得分:1)

使用parse-url将url拆分为单个组件,操作路径并将其编译回来:

$str = 'http://localhost:8000/search/fa?q=sth';

$parts = parse_url($str);

//play with the last part of the path:
$path = explode('/', $parts['path']);
$last = array_pop($path);
if (!in_array($last, ['en','fa'])) {        
    $path[] = $last;
}
$path[]='en';

//compile url
$result = "";
if (!empty($parts['scheme'])) {
    $result .= $parts['scheme'] . "://";
}
if (!empty($parts['host'])) {
    $result .= $parts['host'];
}
if (!empty($parts['port'])) {
    $result .= ":" . $parts['port'];
}
if (!empty($path)) {
    $result .= implode('/', $path);
}
if (!empty($parts['query'])) {
    $result .= '?' . $parts['query'];
}

echo $result;

Example