2017-10-09 186 views
1

對不起,我不明白。我想用的preg_replace此選項可將鏈接文字轉換:preg_replace()轉換爲URL +縮短+從域開始

  1. 文本到HTML(含鏈接)
  2. 修剪文本,直到域(爲https://或http://或www。)
  3. 縮短長的URL(例如,以20標誌)

所以,這樣的文字:

https://stackoverflow.com/questions/ask 

應該轉換爲這樣的輸出:

<a HREF="https://stackoverflow.com/questions/ask">stackoverflow.com/quest...</a> 

對於這個問題我號有這樣的解決方案:

$linktext = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a href=\"$1\">$1</a>", $linktext); 

...但比它不可能改變這個變量質疑2個3

任何想法如何解決這個有一個替換操作(與數組或東西)?

+2

你怎麼樣用'parse_url '而不是正則表達式。 http://php.net/manual/en/function.parse-url.php – bassxzero

+2

也許這個線程會很有用,https://stackoverflow.com/questions/46491514/linkify-urls-with-php-trim-outputted -urls-length /(也請注意'www'的註釋) – chris85

回答

1

我想你會找不到一個正則表達式來解決這個問題。然而,你可以使用普通的PHP,這就是我在我的答案中要做的。

$linktext = 'https://stackoverflow.com/questions/ask'; 
$linktrimmed = str_replace(['https://', 'http://', 'www.'], '', $linktext); // Remove `https://`, `http://` or `www.` 
$linktrimmed = ((strlen($linktrimmed) > 20) ? substr($linktrimmed, 0, 20) . '...' : $linktrimmed); // Shorten to 20 characters and add ellipsis (if neccessary). From https://stackoverflow.com/a/11434149/3088508 
$linktext = "<a href=\"$linktext\">$linktrimmed</a>"; 
echo $linktext; 

這將返回:

<a href="https://stackoverflow.com/questions/ask">stackoverflow.com/qu...</a> 

eval.in demo

基本上它是所有:

  1. str_replacehttps://http://www.與空字符串''
  2. 如果URL是超過20個字符,則它substr更長,添加省略號...(從這個SO post借代碼)
  3. 塞進一個HTML <a>標籤。
+1

這會在URL中留下任何查詢字符串參數。猜測沒關係,儘管OP沒有說明。 –

1

1,創建如下功能:

function string_begins_with($string, $search) { 
    return (strncmp($string, $search, strlen($search)) == 0) ; 
} 

然後按如下方式使用此功能:

$linktext = "https://www.stackoverflow.com/questions/ask" ; 
$trimmedText = $linktext ; 

if (string_begins_with($trimmedText, "https://")) { //Removes https:// 
    $trimmedText = substr($trimmedText, 8) ; 
} 
if (string_begins_with($trimmedText, "http://")) { //Removes http:// 
    $trimmedText = substr($trimmedText, 7) ; 
} 
if (string_begins_with($trimmedText, "www.")) { //Removes www. 
    $trimmedText = substr($trimmedText, 4) ; 
} 
if (strlen($trimmedText) > 20) { //Trim the text to 20 characters 
    $trimmedText = substr($trimmedText, 0, 20) . "..." ; 
} 

echo "<a href='$linktext'>$trimmedText</a>" ; 
1

使用parse_url

(如@bassxzero建議)中的註釋

這極大地簡化es提取主機名和路徑,只需要一個substr操作即可完成您的要求。

function getShortUrl($url) { 
    $cleanedUrl = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH); 
    $shortUrl = substr($cleanedUrl, 0, 20); 

    if ($shortUrl !== $cleanedUrl) { 
     // it's been truncated, add ellipsis 
     $shortUrl .= "..."; 
    } 

    return $shortUrl; 
} 

$linktext = 'https://example.com/test?abc=123'; 

echo "<a href='$linktext'>". getShortUrl($linktext) ."</a>"; 
+1

@Sebastian,注意:檢查像這樣的解決方案和完整的正則表達式解決方案(按照您的要求)之間的性能差異應該相當簡單。我懷疑你會發現這個更快。 –

1

您需要preg_replace_callback()以及parse_url()。基本上,找到匹配,然後解析網址,擺脫該計劃,刪除www。 (我假設你需要保持子域如果不是WWW),並減去剩餘的字符,如果有超過20個(並添加週期):

<?php 
$url = "this is the link: https://stackoverflow.com/questions/ask";  
$linktext = preg_replace_callback("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", function ($m) { 
    $url = $m[0]; 
    $parts = parse_url($url); 
    $parts["host"] = str_replace("www.", "", $parts["host"]); 
    array_shift($parts); // remove the scheme 
    $shortURL = implode("", $parts); 
    $shortenedURL = substr($shortURL, 0, 20); 
    if (strlen($shortURL) > 20) $shortenedURL .= "..."; 
    return "<a href=\"".$url."\">".$shortenedURL."</a>"; 
    var_dump($parts); 
}, $url); 
echo $linktext; 

Demo