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

问题描述 投票:0回答:1

正如标题所述,我正在尝试在字符串中使用is.gd api缩短all网址,并将其链接起来。

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个或更多,则它们最终都相同。

if theres 2 or more they all end up the same

注意:不允许发布is.gd,因此我以为我发布了此处不允许的短链接,因此我不得不将其更改为isnot.gd

php json api foreach preg-match-all
1个回答
0
投票

您的变量$link不是数组,因此它仅采用$link的最后分配值。您可以将preg_replace替换为str_replace,并通过匹配和链接传递数组。

您也可以使用preg_replace_callback(),并且可以将$ matches直接传递给函数,该函数将替换为link。 https://stackoverflow.com/a/9416265/7082164

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.