猿问

php 在字符串中使用 is.gd api 缩短所有 url 并将它们链接起来

正如标题所说,我正在尝试用字符串中的 is.gd api缩短所有url 并将它们链接起来。


function link_isgd($text)

{

    $regex = '@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-~]*(\?\S+)?)?)?)@';

    preg_match_all($regex, $text, $matches);


    foreach($matches[0] as $longurl)

    {

        $tiny = file_get_contents('http://isnot.gd/api.php?longurl='.$longurl.'&format=json');

        $json = json_decode($tiny, true);


        foreach($json as $key => $value)

        {

            if ($key == 'errorcode')

            {

                $link = $longurl;

            }

            else if ($key == 'shorturl')

            {

                $link = $value;

            }

        }

    }

    return preg_replace($regex, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $text);

}


$txt = 'Some text with links https://www.abcdefg.com/123 blah blah blah https://nooodle.com';


echo link_isgd($txt);


这是我到目前为止所得到的,链接有效,如果字符串中只有 1 个 url,则缩短也是如此,但是如果有 2 个或更多,它们最终都会相同。

注意:在帖子中不允许is.gd,所以我以为我发布了一个在这里不允许的短链接,所以我不得不将它更改为isnot.gd



慕神8447489
浏览 120回答 1
1回答

牧羊人nacy

您的变量$link不是数组,因此它只需要最后分配的值$link. 您可以preg_replace用str_replace匹配项和链接替换并传递数组。您也可以使用preg_replace_callback()并且可以将 $matches 直接传递给将替换为链接的函数。function link_isgd($text){    $regex = '@(https?://([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-~]*(\?\S+)?)?)?)@';    preg_match_all($regex, $text, $matches);    $links = [];    foreach ($matches[0] as $longurl) {        $tiny = file_get_contents('http://isnot.gd/api.php?longurl=' . $longurl . '&format=json');        $json = json_decode($tiny, true);        foreach ($json as $key => $value) {            if ($key == 'errorcode') {                $links[] = $longurl;            } else if ($key == 'shorturl') {                $links[] = $value;            }        }    }    $links = array_map(function ($el) {        return '<a href="' . $el . '" target="_blank">' . $el . '</a>';    }, $links);    return str_replace($matches[0], $links, $text);}
随时随地看视频慕课网APP
我要回答