2013-06-25 33 views
1

我是新手到php得到两个结果不重复preg_match和file_get_contents

而且我需要从同一页得到两个结果。 OG:图片和og:视频

这是我当前的代码

preg_match('/property="og:video" content="(.*?)"/', file_get_contents($url), $matchesVideo); 
preg_match('/property="og:image" content="(.*?)"/', file_get_contents($url), $matchesThumb); 

$videoID = ($matchesVideo[1]) ? $matchesVideo[1] : false; 
$videoThumb = ($matchesThumb[1]) ? $matchesThumb[1] : false; 

有没有重复我的代码

+1

当然,将file_get_contents的结果分配给一个变量。 – datasage

+0

但你必须做两次preg_match,因为它不是相同的操作。但是,做'$ content = file_get_contents($ url);'会节省很多次 –

回答

1

有具有这两条线没有问题,执行相同的操作方式。我会改变的是对file_get_contents($url)的双重打击。

只是将其更改为:

$html = file_get_contents($url); 
preg_match('/property="og:video" content="(.*?)"/', $html, $matchesVideo); 
preg_match('/property="og:image" content="(.*?)"/', $html, $matchesThumb); 
-1

有没有重复我的代码

总是有两种方法可以做到这一点,执行相同的操作方式:

  1. 缓冲执行结果 - 而不是多次执行。
  2. 编码重复 - 从代码中提取参数。

在编程中,您通常使用两者。例如,文件I/O操作的缓冲:

$buffer = file_get_contents($url); 

而对于匹配,你编码重复:

$match = function ($what) use ($buffer) { 
    $pattern = sprintf('/property="og:%s" content="(.*?)"/', $what); 
    $result = preg_match($pattern, $buffer, $matches); 
    return $result ? $matches[1] : NULL; 
} 

$match('video'); 
$match('image'); 

这仅仅是示范性展示了我的意思。这取决于你想要做什么,例如后者允许使用不同的实现来替换匹配,比如使用HTML解析器,但您可能会发现代码太多,无法执行缓冲操作。

E.g.以下内容也可以适用:

$buffer = file_get_contents($url); 
$mask = '/property="og:%s" content="(.*?)"/'; 
preg_match(sprintf($mask, 'video'), $buffer, $matchesVideo); 
preg_match(sprintf($mask, 'image'), $buffer, $matchesThumb); 

希望这会有所帮助。

2

文件内容保存到一个变量,如果你想运行一个正则表达式,你可以选择:

$file = file_get_contents($url); 
preg_match_all('/property="og:(?P<type>video|image)" content="(?P<content>.*?)"/', $file, $matches, PREG_SET_ORDER); 

foreach ($matches as $match) { 
    $match['type'] ... 
    $match['content'] ... 
} 

由于@hakre指出,不需要第一个括号对:

第一括号对使用无捕获改性剂?:,它会导致匹配项,但是没有存储

捕获组使用名为子模式?P<name>的第二捕获组建立任意两个词是可能的匹配image|video

+0

第一个(不匹配的)括号对对我来说看起来是多余的。无论如何,组0将匹配,子组仍然会匹配。这只是没有必要的,所以你可以专注于解释被定义的子模式,而不是首先讨论一个不需要的非匹配组; – hakre

+0

我不这么认为,不同'type'的标签可能匹配模式 –

+0

不,只有整个模式可以匹配。这是视频或图像,没有其他类型。组0是内在的,你不需要明确地创建它(总是整个模式,理想情况下使用()作为外部括号而不是//)。试试看。 – hakre