I want to make it so that in my chat-application, links to websites can be clickable and links to YouTube and images automatically gets embedded.
I\'ve made this cod
I had some issues with the preg_replace_callback
when the text included three dots ...
. The above code recognized the three dots as a URL which is not true.
Here is my fix and it seems to work at the moment $str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:jpe?g|png|gif)#', function($arr)
Would this fix fail in other cases???
The code of Tim Cooper doesn't working with https link. Ex: https://www.facebook.com/ It will return http://https://www.facebook.com/
Replace
if(strpos($arr[0], 'http://') !== 0)
by
if(strpos($arr[0], 'http') !== 0)
Here is a solution I came up with:
$str = 'This is an image: google.ca/images/srpr/logo3w.png
YouTube: http://www.youtube.com/watch?v=V2b8ilapFrI&feature=related
Stackoverflow: http://stackoverflow.com/';
$str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:\S+\.\S+)#', function($arr)
{
if(strpos($arr[0], 'http://') !== 0)
{
$arr[0] = 'http://' . $arr[0];
}
$url = parse_url($arr[0]);
// images
if(preg_match('#\.(png|jpg|gif)$#', $url['path']))
{
return '<img src="'. $arr[0] . '" />';
}
// youtube
if(in_array($url['host'], array('www.youtube.com', 'youtube.com'))
&& $url['path'] == '/watch'
&& isset($url['query']))
{
parse_str($url['query'], $query);
return sprintf('<iframe class="embedded-video" src="http://www.youtube.com/embed/%s" allowfullscreen></iframe>', $query['v']);
}
//links
return sprintf('<a href="%1$s">%1$s</a>', $arr[0]);
}, $str);
Let me know if you need me to clarify anything for you.