2015-10-13 147 views
-4

我有"/foo/bar/url/"直接在我的域名後面。PHP用str_replace()替換URL段;

我想要的是在我的字符串中找到倒數第二個斜槓符號,並用斜槓符號+標籤替換它。像這樣:從//#(問題不在於如何獲得URL,而是如何處理它)

這是如何實現的?做這種事情的最佳做法是什麼? 目前我很確定我應該使用str_replace();

UPD。我認爲preg_replace()將適合我的情況。但是接下來還有一個問題:爲了解決我的問題,應該使用什麼樣的正則表達式?

P.S.只是在我使用SilverStripe框架的情況下(v3.1.12

+0

**「問題不在於如何讓網址,但該如何處理呢」 **我感到困惑的是什麼你需要。 –

+0

like'$ uri。 「#」'?這似乎太容易了。 –

+0

事情是,我知道如何得到字符串,我用替換倒數第二個斜槓與我的模式有問題。 爲什麼我告訴你我正在使用SilverStripe框架和其他可能與我的帖子無關的東西 - 因爲SilverStrtipe內置的功能我可能還不知道。所以就像也許有更簡單的方法來實現我想要的,而不使用自定義的PHP代碼。 –

回答

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 
+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; 
0

在我的情況下,這解決了我的問題:

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

假設你現在有

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

您可以像

$handledUrl = $this->ParentID 
    ? $this->Parent()->Link() + '#' + $this->URLSegment 
    : $this->Link(); 

結合起來,其中$this->Parent()->Link()是如/富/酒吧$this->URLSegment我-urlsegment

$this->ParentID還檢查,如果我們有一個父頁面或正在SiteTree

的頂級
1

我可能是tooooo遲到回答這個問題,但我認爲這可能會幫助你。你可以簡單地使用preg_replace等作爲

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

輸出:

/foo/bar/#url