2015-08-24 58 views
0

我有下面的功能來簡單地在某些文本中找到一個URL並將其更改爲超鏈接;但它也顯示整個網址。我怎樣才能使該功能動態地顯示域名?只顯示用超鏈接替換URL時的域名

// URL TO HYPERLINK 
function activeUrl($string) { 
$find = array('`((?:https?|ftp)://\S+[[:alnum:]]/?)`si', '`((?<!//)(www\.\S+[[:alnum:]]/?))`si'); 

$replace = array('<a href="$1" target="_blank">$1</a>', '<a href="http://$1" target="_blank">$1</a>'); 
return preg_replace($find,$replace,$string); 
} 
+0

'$ string'看起來像什麼? – Kisaragi

+0

聲音像[parse_url](http://php.net/parse_url)可能對您有用。 –

+0

$ string是在while循環中,而while循環顯示來自查詢的結果。 – idexo

回答

5

那麼,這是因爲你的正則表達式匹配整個網址。你需要分解你的整個正則表達式並進行組合。

我使用這個表達式,這在我的測試上regex101.com工作正常

((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w][email protected])?([A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w][email protected])[A-Za-z0-9.-]+))((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?) 

的字符串https://www.stackoverflow.com/question/32186805這些比賽

1) https://www.stackoverflow.com/question/32186805 
2) https://www.stackoverflow.com 
3) https:// 
4) www.stackoverflow.com 
5) /question/32186805 

現在我們有域僅列第四組並且可以使用$4僅將該域顯示爲超鏈接文本。

function activeUrl($string) { 
    $find = '/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w][email protected])?([A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w][email protected])[A-Za-z0-9.-]+))((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/si'; 

    $replace = '<a href="$1" target="_blank">$4</a>'; 
    return preg_replace($find, $replace, $string); 
} 
+0

我是初學者,所以我不擅長這個,但是在你編輯的'$ find'處必須有錯誤。替換代碼後我得到一個空白頁面。 – idexo

+0

因爲我忘了分號,請再次嘗試3分鐘前更新密碼。你也應該在'php.ini'中激活php錯誤。 –

+0

好的。現在與「HTTP」的鏈接工作,但當我只使用www.example.com它不起作用。 ('display_errors','On');我想要的是: //開或關' 並感謝您的努力。我會接受你的回答,所以請編輯它與'www'網址一起工作 – idexo

3

您可以使用preg_match_all提取網址,然後parse_url功能,只需要域名。

function extractUrl ($string) { 
    preg_match_all('!https?://\S+!', $string, $matches); 
    $url = $matches[0]; 
    $parsedUrl = parse_url($url[0]); // Use foreach in case you have more than one url. 
    $domain="http://".$parsedUrl['host']; 
    return $domain; 
} 

$string="this is a url http://yourUrl.com/something/anything"; 
echo extractUrl($string); //http://yourUrl.com 
+0

謝謝你的回答。我很可能會接受夏洛特的答案,但我也會注意到你的解決方案。 – idexo

+0

謝謝@idexo! – Enzo