PHP用str_replace()替换URL段;

时间:2015-10-13 22:20:51

标签: php string replace silverstripe

我的"/foo/bar/url/"直接来自我的域名。

我想要的是在我的字符串中找到倒数第二个斜杠符号,并用斜杠符号+ hashtag替换它。像这样:从//#(问题不在于如何获取网址,而是如何处理网址)

如何实现这一目标?做这样的事情的最佳做法是什么? 目前,我非常确定我应该使用str_replace();

UPD。我认为preg_replace()适合我的情况。但是还有另外一个问题:为了让我的问题得到解决,regexp应该是什么样的?

P.S。我只是在使用SilverStripe框架( v3.1.12

的情况下

5 个答案:

答案 0 :(得分:1)

这是一个可以运作的方法。可能有更简洁的方法。

// Let's assume you already have $url_string populated
$url_string = "http://whatever.com/foo/bar/url/";

$url_explode = explode("\\",$url_string);
$portion_count = count($url_explode);

$affected_portion = $portion_count - 2; // Minus two because array index starts at 0 and also we want the second to last occurence

$i = 0;
$output = "";
foreach ($url_explode as $portion){

    $output.=$portion;

    if ($i == $affected_portion){
        $output.= "#";
    }

    $i++;

}

$new_url = $output;

答案 1 :(得分:1)

$url = '/foo/bar/url/';

if (false !== $last = strrpos($url, '/')) {
    if (false !== $penultimate = strrpos($url, '/', $last - strlen($url) - 1)) {
        $url = substr_replace($url, '/#', $penultimate, 1);
    }
}

echo $url;

这将输出

/foo/bar/#url/

如果你想剥去最后一个/

echo rtrim($url, '/'); // print /foo/bar/#url

答案 2 :(得分:1)

假设你现在有

$url = $this->Link(); // e.g. /foo/bar/my-urlsegment

你可以像

一样组合它
$handledUrl = $this->ParentID 
    ? $this->Parent()->Link() + '#' + $this->URLSegment
    : $this->Link();

其中$this->Parent()->Link()例如是 / foo / bar $this->URLSegment my-urlsegment

$this->ParentID还会检查我们是否有父网页或是否位于SiteTree的顶层

答案 3 :(得分:1)

我回答这个问题可能太晚了,但我认为这可能会对你有所帮助。您可以像{/ p>一样使用preg_replace

$url = '/foo/bar/url/';
echo preg_replace('~(\/)(\w+)\/$~',"$1#$2",$url);

<强>输出:

/foo/bar/#url

答案 4 :(得分:0)

在我的情况下,这解决了我的问题:

$url = $this->Link();
$url = rtrim($url, '/');
$url = substr_replace($url, '#', strrpos($url, '/') + 1, 0);