Regex PHP – Rileva automaticamente i link di YouTube, immagini e "regolari"

Voglio fare in modo che nella mia applicazione di chat, i link ai siti web possano essere cliccabili e link a YouTube e le immagini vengano automaticamente incorporate.

Ho realizzato questo codice in Java per il mio client WebIRC ma ora sto provando a farlo in PHP e JavaScript.

Non ho ancora familiarità con PHP quindi non so molto sull'uso di regex lì. Mi chiedo se un'anima gentile possa aiutarmi con questo …

Per la cosa di YouTube ho provato questo senza successo:

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

Ecco una soluzione che ho trovato:

 $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_arrays($url['host'], arrays('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); 

Fammi sapere se hai bisogno di me per chiarire qualsiasi cosa per te.

Ho avuto alcuni problemi con il preg_replace_callback quando il text includeva tre punti ... Il codice sopra ha riconosciuto i tre punti come un URL che non è vero.

Ecco la mia correzione e sembra funzionare al momento $str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:jpe?g|png|gif)#', function($arr)

Questa correzione fallirebbe in altri casi ???

Il codice di Tim Cooper non funziona con il link https. Es: https://www.facebook.com/ Restituirà http: // https: //www.facebook.com/

Sostituire

 if(strpos($arr[0], 'http://') !== 0) 

di

 if(strpos($arr[0], 'http') !== 0)