获得两个结果,而不重复preg_match和file_get_contents

时间:2013-06-25 00:31:53

标签: php preg-match file-get-contents

我是php的新手

我需要从同一页面获得两个结果。 og:image和og:video

这是我目前的代码

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;

有没有办法在不重复我的代码的情况下执行相同的操作

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);

答案 2 :(得分:-1)

  

有没有办法在不重复我的代码的情况下执行相同的操作

总有两种方法可以做到:

  1. 缓冲执行结果 - 而不是多次执行。
  2. 对重复进行编码 - 从代码中提取参数。
  3. 在编程中,您通常会使用两者。例如,缓冲文件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);
    

    希望这有帮助。