php сократите все URL-адреса с помощью is.gd api в строке и свяжите их - PullRequest
0 голосов
/ 30 мая 2020

Как видно из названия, я пытаюсь сократить все URL-адреса с помощью is.gd api в строке и связать их.

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.

1 Ответ

2 голосов
/ 30 мая 2020

Ваша переменная $link не является массивом, поэтому она принимает только последнее присвоенное значение $link. Вы можете заменить preg_replace на str_replace и передавать массивы с совпадениями и ссылками.

Вы также можете использовать preg_replace_callback(), и вы можете передавать $ совпадения напрямую в функцию, которая заменит ссылку. { ссылка }

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);
}
...