用于视频swf的PHP正则表达式

14

我想从一个Object/Embed HTML源代码中获取视频URL,我知道可以使用正则表达式来获取,但是我和正则表达式不太熟悉。

这是我的源代码:

<?php 

function src($text) {
    $text = str_replace('"', '', $text);
    $text = str_replace('src=', '', $text);
    $temporary = explode('<embed', $text);
    $temporary = $temporary[1];
    $temporary = explode(' ', trim($temporary));
    return $temporary[0];
} 

$html = '
<object width="180" height="220">
    <param name="movie" value="http://www.domain.com/video/video1.swf"></param>
    <embed src="http://www.domain.com/video/video1.swf" type="application/x-shockwave-flash" width="180" height="220"></embed>
</object>
'; 

echo src($html);
这个有效,但用正则表达式会更好吗?
我正在使用 lamp。
2个回答

14

正则表达式更适合这种情况,因为 src 可能不在第一个属性,所以这种方法行不通。

这是我的建议:

function src($html) {
 if(preg_match('#<embed[^>]*?src=["\'](.*?)["\'](.*?)></embed>#si', stripslashes($html), $src)) {
  return $src[1];
 }
 return ''; // or any other error if you need
}

echo src($html);
将输出:http://www.domain.com/video/video1.swf [^>] 匹配不包含在括号中的单个字符。 [^>] 匹配除了 > 之外的任何字符。 ["\'] 匹配 src=" 或者 src='(.*?) 点 (.) 表示匹配任何字符。星号 (*) 表示零次或多次。问号 (?) 表示贪婪模式,只要模式仍然匹配就一直匹配。将它们组合起来,表示尝试匹配任何字符,零次或多次,并且尽可能多地获取。 /i 是忽略大小写的。
这里有更多信息: http://en.wikipedia.org/wiki/Regular_expression http://www.regular-expressions.info/reference.html

关于["|\']子表达式... |字符在字符类中 不是 元字符(您不能在字符类中进行选择)。您想要的只是["'] - ridgerunner
?的意思是非贪婪模式,不要贪心。 - user938787

1

为什么不使用DOM解析器呢?它专门设计用于这种工作。

$dom = new DOMDocument;

$dom->loadHTML($html);

$embed = $dom->getElementsByTagName('embed');

if ($embed->length) {
   $embed = $embed->item(0);

   if ($embed->hasAttribute('src')) {
       $src = $embed->getAttribute('src');
       // `$src` holds the `src` attribute of the `embed` element.  
   }
}

CodePad


10
警告:DOMDocument::loadHTML() [function.DOMDocument-loadHTML]:在实体中的param标签未预期地结束,行号为17,位于test.php的第24行。 - E.G.
那是一个警告,因为你的HTML无效。它仍然可以工作。 - alex
@EscoMaji...你的HTML也无效吗? - alex
@Derek,那你有什么建议呢?而且说“DOMDocument”很慢,这与你对一个完全不了解的应用程序有何关系? - alex
@alex 我从问题中复制了代码,我更喜欢使用这个解决方案,因为它更简单,但是我做错了什么吗?- 我在这一行得到了错误:$dom->loadHTML($html); - EscoMaji
@EscoMaji 这只是一个解析警告,你不必过于担心。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接