【问题标题】:Regex PHP - Auto-detect YouTube, image and "regular" linksRegex PHP - 自动检测 YouTube、图像和“常规”链接
【发布时间】:2011-11-06 12:35:16
【问题描述】:

我想让它在我的聊天应用程序中,可以点击到网站的链接,并自动嵌入到 YouTube 和图像的链接。

我已经用 Java 为我的 WebIRC 客户端制作了这段代码,但现在我正尝试用 PHP 和 JavaScript 制作它。

我还不熟悉 PHP,所以我不太了解在那里使用正则表达式。我想知道是否有好心人可以帮助我解决这个问题...

对于YouTube-thingy,我尝试了这个但没有成功:

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

【问题讨论】:

  • 请举例说明你想匹配的网址
  • 以 .jpg 结尾的网址 || .gif || .png 应该是嵌入的图像。 youtube 视频 (youtube.com/watch?v=XnWyrdBX08w&feature=feedu) 应提取到视频 id(在本例中为 XnWyrdBX08w)并将其像上面描述的那样放在 iframe 中。所有其他 URL 应该是可点击的链接 ()

标签: php regex hyperlink preg-replace


【解决方案1】:

这是我想出的解决方案:

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

如果您需要我为您澄清任何事情,请告诉我。

【讨论】:

  • Nice =) 喜欢正则表达式回调。
【解决方案2】:

当文本包含三个点 ... 时,preg_replace_callback 出现了一些问题。上面的代码将三个点识别为不正确的 URL。

这是我的修复,目前似乎可以工作$str = preg_replace_callback('#(?:https?://\S+)|(?:www.\S+)|(?:jpe?g|png|gif)#', function($arr)

这个修复在其他情况下会失败吗???

【讨论】:

    【解决方案3】:

    Tim Cooper 的代码不适用于 https 链接。 例如:https://www.facebook.com/ 它将返回http://https://www.facebook.com/

    替换

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

    通过

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

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 2012-06-21
      • 2018-12-02
      • 1970-01-01
      • 2013-09-03
      • 2016-07-02
      • 2021-08-01
      • 2010-09-16
      • 2011-04-10
      相关资源
      最近更新 更多