如果是pregmatch,则从双引号中提取媒体

时间:2018-04-28 14:42:35

标签: php regex

我正在获取某个网站的file_get_content并返回此

<meta property="og:video:secure_url" content="//abc-def- 
ghi.net/reg02/2016/05/31/05/92f24c57-2cb3-42b0-84cb-edad24d7b68f.mp4? 
secure=1"><meta property="og:video:type" content="video/mp4"><meta 
property="og:video:width" content="540"><meta property="og:video:height" 
content="960"><meta property="fb:app_id" content="682659535154406">

正如您所看到的,内容被多次写入。我想要做的是,如果我搜索 .mp4 ,如果在某些内容中找到,那么它将复制该双引号内的整个数据 例如,在上面的代码中,它将提取并给我

//mpak-suse1.akamaized.net/reg02/2016/05/31/05/92f24c57-2cb3-42b0-84cb-edad24d7b68f.mp4?secure=1

我对如何做到这一点非常困惑所以没有编码任何东西。 我发现另一种解决方案是在函数

之间使用get string
function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);   
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
$link = get_string_between($output, '<meta property="og:video:secure_url" content="', '">');

但它看起来并不可靠。我要求的东西可以帮助许多其他项目的人。如果有人可以请指教这个话题

1 个答案:

答案 0 :(得分:0)

大多数StackOverflow志愿者建议使用像DomDocument或类似的dom解析器来有效/可靠地解析HTML数据。

代码:(Demo

 $userInput = 2;
 $data = Customer::with('cars')
                ->withCount('cars')
                ->has('cars', '<', $userInput)
                ->orderBy('cars_count', 'desc')
                ->get();

输出:

$html = <<<HTML
<meta property="og:video:secure_url" content="//abc-def- 
ghi.net/reg02/2016/05/31/05/92f24c57-2cb3-42b0-84cb-edad24d7b68f.mp4? 
secure=1"><meta property="og:video:type" content="video/mp4"><meta 
property="og:video:width" content="540"><meta property="og:video:height" 
content="960"><meta property="fb:app_id" content="682659535154406"><meta property="test" nocontent="bad">
HTML;

$dom=new DOMDocument; 
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName("meta") as $meta) {
    if ($meta->hasAttribute('content') && strpos($content = $meta->getAttribute('content'), '.mp4')) {
        $result[] = $content;
    }
}
var_export($result);

*对于记录,是的,我知道使用array ( 0 => '//abc-def- ghi.net/reg02/2016/05/31/05/92f24c57-2cb3-42b0-84cb-edad24d7b68f.mp4? secure=1', ) false进行测试,因为偏移strpos()0松散地评估为false,但逻辑上,如果false值以content开头,则它不会成为可用/合格值。