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 code in Java for my WebIRC client but now I'm trying to make it in PHP and JavaScript.
I'm not familiar with PHP yet so I don't know that much about using regex there. I wonder if some kind soul could help me with this...
For the YouTube-thingy I tried this without success:
if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $message, $m)) {
$video_id = $m[1];
$message = preg_replace("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#","<iframe class='embedded-video' src='http://www.youtube.com/embed/" . $video_id . "' allowfullscreen></iframe>",$message);
}
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.
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???
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With