正则表达式来提取不同视频嵌入来源
我的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
?>
你有没有考虑过解析HTML作为XML(提供的HTML结构良好)提取节点和属性数据,而不是依赖于正则表达式?
我不是很熟悉这个过程,你能指点我正确的方向吗? – Ben 2010-05-11 22:56:12
或解析为SGML/HTML5解析器,这是什么意思解析HTML。 – 2010-05-12 00:43:12
嘿,本!我的道歉,我没有看到您的评论之前。这是一个PHP的XML DOM链接:http://www.w3schools.com/php/php_xml_dom.asp和这个图书馆看起来也很有趣:http://simplehtmldom.sourceforge.net/德兰的建议可能也有帮助。德兰你有一个有用的链接,你可以推荐吗? – gurun8 2010-05-12 02:59:36
这可能是一个新手问题,我如何处理报价?我有$ regexp ='(src | data)=“([^”] +)“' – Ben 2010-05-11 23:16:24
在这里,我扩大了一些答案,包括gurun8和德兰Azabani建议这是你想要去的方式 – 2010-05-12 14:10:20
真棒,这看起来比正则表达式更加容易和有效。感谢您的更新! – Ben 2010-05-12 17:56:40