Php preg_replace()用于转换为URL+;缩短+;从域开始

Php preg_replace()用于转换为URL+;缩短+;从域开始,php,url,hyperlink,preg-replace,trim,Php,Url,Hyperlink,Preg Replace,Trim,对不起,我不明白。我想使用preg_替换为以下选项来转换链接文本: 文本转换为HTML(包括链接) 将文本修剪到域(无https://或http://或www.) 缩短长URL(例如,缩短到20个标志) 因此,本文: https://stackoverflow.com/questions/ask 应转换为此输出: <a HREF="https://stackoverflow.com/questions/ask">stackoverflow.com/quest...</a>

对不起,我不明白。我想使用preg_替换为以下选项来转换链接文本:

  • 文本转换为HTML(包括链接)
  • 将文本修剪到域(无https://或http://或www.)
  • 缩短长URL(例如,缩短到20个标志)
  • 因此,本文:

    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);
    
    $linktext=preg\u replace(“/([\w]+\:\/\/\/[\w-?&;\\~=\.\/\@]+[\w\/])/”,“,”,$linktext);
    
    …但不可能将这个变量改为问题2和问题3


    有没有办法解决这个问题,用一个替换操作(用数组或其他东西)?我想你可能找不到一个正则表达式来解决这个问题。但是,您可以使用常规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;
    
    $linktext='1https://stackoverflow.com/questions/ask';
    $linktrimmed=str_replace(['https://'、'http://'、'www.]、'$linktext);///删除`https://`、`http://`或`www`
    $linktrimmed=((strlen($linktrimmed)>20)?substr($linktrimmed,0,20)。“…”:$linktrimmed);//缩短到20个字符并添加省略号(如有必要)。从…起https://stackoverflow.com/a/11434149/3088508
    $linktext=“”;
    echo$linktext;
    
    这将返回:

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

    基本上它所做的就是:

  • https://
    http://
    www.
    带有空字符串
    '
  • 如果url长度超过20个字符,则将其删除并添加省略号
    (从中借用代码)
  • 填充到html
    标记中

  • 我想你会找不到一个正则表达式来解决这个问题。但是,您可以使用常规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;
    
    $linktext='1https://stackoverflow.com/questions/ask';
    $linktrimmed=str_replace(['https://'、'http://'、'www.]、'$linktext);///删除`https://`、`http://`或`www`
    $linktrimmed=((strlen($linktrimmed)>20)?substr($linktrimmed,0,20)。“…”:$linktrimmed);//缩短到20个字符并添加省略号(如有必要)。从…起https://stackoverflow.com/a/11434149/3088508
    $linktext=“”;
    echo$linktext;
    
    这将返回:

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

    基本上它所做的就是:

  • https://
    http://
    www.
    带有空字符串
    '
  • 如果url长度超过20个字符,则将其删除并添加省略号
    (从中借用代码)
  • 填充到html
    标记中

  • 首先,创建以下函数:

    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>" ;
    
    $linktext=”https://www.stackoverflow.com/questions/ask" ;
    $trimmedText=$linktext;
    如果(字符串以($trimmedText,“https://”)开头,{//删除https://
    $trimmedText=substr($trimmedText,8);
    }
    如果(字符串以($trimmedText,“http://”)开头){//删除http://
    $trimmedText=substr($trimmedText,7);
    }
    如果(字符串以($trimmedText,“www.”)开头){//删除www。
    $trimmedText=substr($trimmedText,4);
    }
    如果(strlen($trimmedText)>20{//将文本修剪为20个字符
    $trimmedText=substr($trimmedText,0,20)。“…”;
    }
    回声“;
    
    首先,创建以下函数:

    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>" ;
    
    $linktext=”https://www.stackoverflow.com/questions/ask" ;
    $trimmedText=$linktext;
    如果(字符串以($trimmedText,“https://”)开头,{//删除https://
    $trimmedText=substr($trimmedText,8);
    }
    如果(字符串以($trimmedText,“http://”)开头){//删除http://
    $trimmedText=substr($trimmedText,7);
    }
    如果(字符串以($trimmedText,“www.”)开头){//删除www。
    $trimmedText=substr($trimmedText,4);
    }
    如果(strlen($trimmedText)>20{//将文本修剪为20个字符
    $trimmedText=substr($trimmedText,0,20)。“…”;
    }
    回声“;
    
    使用 (如@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>";
    
    函数getShortUrl($url){ $cleanedUrl=parse_url($url,PHP_url\u HOST)。parse_url($url,PHP_url\u PATH); $shortUrl=substr($cleanedUrl,0,20); 如果($shortUrl!=$cleanedUrl){ //已被截断,请添加省略号 $shortUrl.=“…”; } 返回$shortUrl; } $linktext='1!'https://example.com/test?abc=123'; 回声“; 使用 (如@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>";
    
    函数getShortUrl($url){ $cleanedUrl=parse_url($url,PHP_url\u HOST)。parse_url($url,PHP_url\u PATH); $shortUrl=substr($cleanedUrl,0,20); 如果($shortUrl!=$cleanedUrl){ //已被截断,请添加省略号 $shortUrl.=“…”; } 返回$shortUrl; } $linktext='1!'https://example.com/test?abc=123'; 回声“; 您需要与。基本上,找到匹配项,然后解析url,去掉方案,删除www(如果不是www,我假设您需要保留子域),如果超过20个字符,则减去剩余字符(并添加句点):

    您需要与。基本上,找到匹配项,然后解析url,去掉方案,删除www(如果不是www,我假设您需要保留子域),如果超过20个字符,则减去剩余字符(并添加句点):


    解析url
    代替正则表达式怎么样。也许这个线程会很有用,(也请注意
    www
    的注释)使用
    parse_url
    而不是regex怎么样。也许这个线程会有用,(也请注意
    www
    )的注释@Sebastian,注意:检查一个