2014-03-03 41 views
0

我想將特定鏈接轉移到另一個鏈接。該模式是這樣的:在特定邏輯上轉換字符串

http://domain.com/sub/code/namehttp://a.domain.com/subs/code/name

我需要域之前a一個字母前綴,則sub將複數subs和多數民衆所有,其餘全部需要相等。

當然的鏈接可以http://wwwhttp://www

開始的substr_replacestrposexplode有些混合,我stucked這個任務1個多小時,決定要求它。

+0

你想什麼你自己嗎? – 2014-03-03 23:28:55

+1

您希望如何傳輸特定的鏈接?我不明白你的意思是「轉移」。 – Lucio

+2

顯示您嘗試的實際代碼。只是指出你使用的PHP函數是毫無意義的。 –

回答

0

試試這個:

<?php 
function convertLink($str) 
{ 
    //ensure a scheme exists 
    if(strpos($str,'http://')===false&&strpos($str,'https://')===false) 
    { 
     $str='http://'.$str; 
    } 
    $parts=parse_url($str); 
    $scheme=$parts['scheme']; 
    $domain=$parts['host']; 
    $path=array_key_exists('path',$parts)?$parts['path']:''; 
    $query=array_key_exists('query',$parts)?('?'.$parts['query']):''; 
    $fragment=array_key_exists('fragment',$parts)?('#'.$parts['fragment']):''; 

    if(strpos($parts['host'],'www.')===0){$domain=substr($parts['host'],4);} 
    if(array_key_exists('port',$parts)){$domain.=':'.$parts['port'];} 
    if(strpos($path,'/sub/')===0){$path='/subs/'.substr($path,5);} 
    return "{$scheme}://a.{$domain}{$path}{$query}{$fragment}"; 
} 

$links=array(); 
$links[]='domain.com/sub/code/name'; 
$links[]='domain.com:20/sub/code/name'; 
$links[]='www.domain.com/sub/code/name'; 
$links[]='http://domain.com/sub/code/name'; 
$links[]='http://www.domain.com/sub/code/name'; 
$links[]='https://domain.com/sub/code/name'; 
$links[]='sub.domain.com/sub/code/name'; 
$links[]='domain.com/sub/code/name?a=1&b=2#c'; 

echo '<pre>'; 
foreach($links as $link) 
{ 
    echo str_pad($link, 40,' ',STR_PAD_RIGHT).'=> '.convertLink($link)."\n"; 
} 
echo '</pre>'; 

輸出:

 
domain.com/sub/code/name    => http://a.domain.com/subs/code/name 
domain.com:20/sub/code/name    => http://a.domain.com:20/subs/code/name 
www.domain.com/sub/code/name   => http://a.domain.com/subs/code/name 
http://domain.com/sub/code/name   => http://a.domain.com/subs/code/name 
http://www.domain.com/sub/code/name  => http://a.domain.com/subs/code/name 
https://domain.com/sub/code/name  => https://a.domain.com/subs/code/name 
sub.domain.com/sub/code/name   => http://a.sub.domain.com/subs/code/name 
domain.com/sub/code/name?a=1&b=2#c  => http://a.domain.com/subs/code/name?a=1&b=2#c 
+0

謝謝,對不起,我還沒有答覆。這實際上解決了我的問題。 – tsm

1

嘗試是這樣的:

/^((?:http://)|(?:http://www\.)|(?:www\.))(\w+)(\.\w+\/)([\w+_\-]+)(\/.*?)$/ 

#$1YOUR_STRING.$2$3SOMETHING_ELSE$5 

RegExr例如:http://regexr.com?38dn0

+0

我其實想要首先實現這個方法,但是因爲我是一個新手,我不能。它促使我發生內部錯誤,當時我的本地開發區關閉了調試模式。一旦我有時間,我一定會檢查這種方法。基本上,我檢查了關於preg_replace的例子,它的工作,當我用你的正則表達式替換你的錯誤發生。 – tsm

1

你所要求是相當模糊的,所以我認爲通過「轉移」你的意思是「替換」。如果是這樣的話,那麼你應該看看正則表達式(或正則表達式)。

正則表達式相對比較普遍,所以當你學習一次的時候,你可以用大多數語言來應用它們。

在PHP中,您可以使用preg_replace執行正則表達式替換,但它可能有助於首先讀取模式的不同元素上的位。

相關鏈接:

preg_replace PHP Function

PCRE Regex Syntax

編輯:最終的結果你仍然可以像你描述使用strposexplode等實現後,但Regexs可能會幫助您更快。