我是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;
有没有办法在不重复我的代码的情况下执行相同的操作
答案 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)
有没有办法在不重复我的代码的情况下执行相同的操作
总有两种方法可以做到:
在编程中,您通常会使用两者。例如,缓冲文件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);
希望这有帮助。