Regex PHP - автоопределение YouTube, изображений и «обычных» ссылок - PullRequest
4 голосов
/ 06 ноября 2011

Я хочу сделать так, чтобы в моем чат-приложении ссылки на веб-сайты можно было нажимать, а ссылки на YouTube и изображения автоматически вставлялись.

Я сделал этот код на Java для своего клиента WebIRCно сейчас я пытаюсь сделать это на PHP и JavaScript.

Я еще не знаком с PHP, поэтому я не очень разбираюсь в использовании там регулярных выражений.Интересно, может ли какая-нибудь добрая душа помочь мне с этим ...

Для YouTube-штуки я попробовал это безуспешно:

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

Ответы [ 3 ]

13 голосов
/ 06 ноября 2011

Вот решение, которое я придумал:

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

Дайте мне знать, если вам понадобится, чтобы я кое-что прояснил для вас.

2 голосов
/ 09 декабря 2013

У меня были некоторые проблемы с preg_replace_callback, когда текст включал три точки .... Приведенный выше код распознал три точки как URL, что не соответствует действительности.

Вот мое исправление, и похоже, оно работает на данный момент $str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:jpe?g|png|gif)#', function($arr)

Не удалось бы это исправить в других случаях ???

0 голосов
/ 23 октября 2016

Код Тима Купера не работает по ссылке https.Пример: https://www.facebook.com/ Возвращается http://https://www.facebook.com/

Заменить

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

на

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