2017-10-09 68 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