1

我是php的新手

我需要从同一页面获得两个结果。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;

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

4

3 回答 3

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 指出的那样,不需要第一个括号对:

第一个括号对使用 no capture 修饰符?:,它会导致匹配但不存储

捕获组使用命名子模式?P<name>,第二个捕获组建立两个词中的任何一个都是可能的匹配image|video

于 2013-06-25T00:48:35.047 回答
1

There is no problem with having those two lines. What I would change though is the double call to file_get_contents($url).

Just change it to:

$html = file_get_contents($url);
preg_match('/property="og:video" content="(.*?)"/', $html, $matchesVideo);
preg_match('/property="og:image" content="(.*?)"/', $html, $matchesThumb);
于 2013-06-25T00:34:04.833 回答
-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 解析器,但你可能会发现它目前的代码太多,无法满足你的需要,只能使用缓冲。

例如,以下内容也适用:

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

希望这可以帮助。

于 2013-06-25T00:47:49.663 回答