php 将字符串中所有带有 is.gd api 的 url 缩短并链接它们
php shorten all urls with is.gd api in a string and linkify them
正如标题所说,我正在尝试缩短 all urls is.gd api 在一个字符串中并 link 化它们。
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);
这是我目前得到的结果,linkifying 有效,如果字符串中只有 1 个 url,则缩短也有效,但是如果有 2 个或更多,它们最终都会相同.
注意: post 中不允许 is.gd
,所以我以为我是 post 做空 link这是不允许的,所以我不得不将其更改为 isnot.gd
.
您的变量 $link
不是数组,因此它只接受最后分配的值 $link
。您可以将 preg_replace
替换为 str_replace
并传递带有匹配和 links 的数组。
您也可以使用 preg_replace_callback()
,您可以将 $matches 直接传递给将替换为 link 的函数。
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);
}
正如标题所说,我正在尝试缩短 all urls is.gd api 在一个字符串中并 link 化它们。
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);
这是我目前得到的结果,linkifying 有效,如果字符串中只有 1 个 url,则缩短也有效,但是如果有 2 个或更多,它们最终都会相同.
注意: post 中不允许 is.gd
,所以我以为我是 post 做空 link这是不允许的,所以我不得不将其更改为 isnot.gd
.
您的变量 $link
不是数组,因此它只接受最后分配的值 $link
。您可以将 preg_replace
替换为 str_replace
并传递带有匹配和 links 的数组。
您也可以使用 preg_replace_callback()
,您可以将 $matches 直接传递给将替换为 link 的函数。
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);
}