preg_replace()用于转换为URL + Shorten +从域

时间:2017-10-09 17:51:38

标签: php url hyperlink preg-replace trim

抱歉,我不明白。我想通过使用带有以下选项的preg_replace来转换Linktext:

  1. 文字到HTML(包括链接)
  2. 将文本修剪到域(无https://或http://或www。)
  3. 缩短长网址(例如,缩写为20个星座)
  4. 所以,这个文字:

    https://stackoverflow.com/questions/ask
    

    应转换为此输出:

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

    对于问题1,我有这个解决方案:

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

    ...但是不可能将此变量更改为问题2和3。

    有任何想法如何修复此问题以进行一次替换操作(使用数组或其他内容)?

4 个答案:

答案 0 :(得分: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_replace https://http://www.空字符串''
  2. 如果网址长度超过20个字符,则substr加上省略号...(借用此SO post借用的代码)
  3. 填入html <a>标记。

答案 1 :(得分: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>" ;

答案 2 :(得分:1)

使用parse_url

(正如@bassxzero建议的那样)在评论中

这极大地简化了提取主机名和路径的过程,只需要一次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>";

答案 3 :(得分: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