我正在完成一个转换字符串并将其作为链接传递的脚本,但除此之外,它还会使用API缩短URL。问题是我无法想到如何只获取URL而不是整个链。
功能:
function findAndShort($string) {
$text = preg_replace("/(https?|ftps?|mailto):\/\/([-\w\p{L}\.]+)+(:\d+)?(\/([\w\p{L}\/_\.#]*(\?\S+)?)?)?/u", '<a href="$0">$0</a>', $string);
return $text;
}
示例:
$chk = findAndShort("Blahblah http://domain.tld");
echo $chk;
在这种情况下,只需要http://domain.tld,我尝试使用$ chk [0],但当然,打印第一个字符就行了。
答案 0 :(得分:0)
具有函数的东西是你只能返回函数中return
下的单个值,所以在你的情况下,在测试你的函数之后,返回值是原始输入值。
如果您希望函数只返回URL组件,我会使用explode
来分隔字符串,然后在preg_match
函数的结果数组的每个部分上运行explode
https,ftp或mailto,一旦我知道我正在使用的数组的哪个部分,我就会停止进程,定义var,因为我相信你想要返回链接的代码,我会做的就是做类似的事情
return '<a href="'.$url.'">'.$url.'</a>';
请注意,var $url
将从上面的过程创建。
我希望这会有所帮助。
答案 1 :(得分:0)
只需在正则表达式的开头添加^.*
并使用$ 1而不是$ 0:
$text = preg_replace("/^.*((https?|ftps?|mailto):\/\/([-\w\p{L}\.]+)+(:\d+)?(\/([\w\p{L}\/_\.#,]*(\?\S+)?)?)?)/u", '<a href="$1">$1</a>', $string);
您还可以简化一下,
~^.*((https?|ftps?|mailto)://[-\p{L}\p{N}_.]+(:\d+)?(/([\p{L}\p{N}/_.#,]*(\?\S+)?)?)?)~u