Regex PHP - Auto-detect YouTube, image and “regular” links

前端 未结 3 483
情话喂你
情话喂你 2020-12-17 04:47

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

相关标签:
3条回答
  • 2020-12-17 05:27

    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???

    0 讨论(0)
  • 2020-12-17 05:35

    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)
    
    0 讨论(0)
  • 2020-12-17 05:39

    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.

    0 讨论(0)
提交回复
热议问题