正则表达式来提取不同视频嵌入来源

问题描述:

我的SMF论坛包含视频文章,我想提取它们以显示在Wordpress主页上。我目前的正则表达式(感谢!)提取了我使用AutoEmbed嵌入的视频的URL。正则表达式来提取不同视频嵌入来源

一切正常,直到一个帖子是这样的:

<embed height="600" width="600" allowscriptaccess="never" quality="high" loop="true" play="true" src="http://mmavlog.net/embed/player.swf?file=http://video.ufc.tv/CSG/UFC113/20100507_ufc113_weigh_in_400k.flv" type="application/x-shockwave-flash"> 

这里是我当前的正则表达式:

$regexp = "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i"; 

由于帖子可以包含<embed><object>我意识到,寻找在URL中使用“http”可能不准确。如何使用正则表达式来查找“src =”为<embed>,“data =”为<object>

怎么不去做它,即使它的工作原理:

$str = <<<HTML 
<object width="550" height="400"> 
    <param name="movie" value="somefilename.swf"> 
    <embed src="somefilename.swf" width="550" height="400"> 
    </embed> 
</object> 
HTML; 

$matches = array(); 
if (preg_match_all('/(src|value)="([^"]+)"/', $str, $matches)) { 
    print_r($matches); 
} 
// Array 
// (
//  [0] => Array 
//   (
//    [0] => value="somefilename.swf" 
//    [1] => src="somefilename.swf" 
//  ) 
// 
//  [1] => Array 
//   (
//    [0] => value 
//    [1] => src 
//  ) 
// 
//  [2] => Array 
//   (
//    [0] => somefilename.swf 
//    [1] => somefilename.swf 
//  ) 
// 
//) 

如何真正做到这一点:

这是如何与simplehtmldom解析HTML的例子,这是你应该使用正则表达式来做什么(尽管你可以使用任何其他HTML解析器,但不是严格意义上的simplehtmldom,它们大多数都有类似的API)。

<?php 
include('simple_html_dom.php'); 

$str = <<<HTML 
<object width="550" height="400"> 
    <param name="movie" value="somefilename.swf"> 
    <embed src="somefilename.swf" width="550" height="400"> 
    </embed> 
</object> 
HTML; 

$html = str_get_html($str); 
$embed = $html->find('embed', 0); 
echo $embed->src; 
// prints somefilename.swf 

$object = $html->find('object param', 0); 
echo $object->value; 
// prints somefilename.swf 
?> 
+0

这可能是一个新手问题,我如何处理报价?我有$ regexp ='(src | data)=“([^”] +)“' – Ben 2010-05-11 23:16:24

+0

在这里,我扩大了一些答案,包括gurun8和德兰Azabani建议这是你想要去的方式 – 2010-05-12 14:10:20

+0

真棒,这看起来比正则表达式更加容易和有效。感谢您的更新! – Ben 2010-05-12 17:56:40

你有没有考虑过解析HTML作为XML(提供的HTML结构良好)提取节点和属性数据,而不是依赖于正则表达式?

+0

我不是很熟悉这个过程,你能指点我正确的方向吗? – Ben 2010-05-11 22:56:12

+0

或解析为SGML/HTML5解析器,这是什么意思解析HTML。 – 2010-05-12 00:43:12

+0

嘿,本!我的道歉,我没有看到您的评论之前。这是一个PHP的XML DOM链接:http://www.w3schools.com/php/php_xml_dom.asp和这个图书馆看起来也很有趣:http://simplehtmldom.sourceforge.net/德兰的建议可能也有帮助。德兰你有一个有用的链接,你可以推荐吗? – gurun8 2010-05-12 02:59:36

要解决的正则表达式:

/(?:src|data)="([^"]+)"/ 

一个提示:避免嵌入视频与embedobject - 这是2002年如此尝试使用更简单,更强大的video标签(要求无插件)。

+1

我会爱上使用视频标签,但并非所有的浏览器都支持它... – Ben 2010-05-11 22:57:49

+0

你更愿意'没有IE支持'或'越野车,不安全和未来的防护技术'吗? ;) – 2010-05-12 00:42:43

+1

哈,好的回应,但由于60%的用户是IE浏览器,我坚持到更新。 – Ben 2010-05-12 17:53:37