2013-06-25 2 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, так как это не та же операция. но yeat, делая '$ 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. Кодировать повторение - извлекать параметры из кода.

В программировании вы обычно пользуетесь обоими. Например буферизация операции файлового ввода/вывода:

$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 указывает, первая пара скобок не нужна:

Первая пара скобок использует не поимка модификатор ?:, это не вызывает матч, но не хранится

захват группы s использует подшаблоны ?P<name>, вторая группа захвата устанавливает любое из двух слов, это возможное совпадение image|video.

+0

Первая (несогласованная) скобка для пары выглядит излишней для меня. Группа 0 будет в любом случае соответствовать, подгруппы будут соответствовать в любом случае. Это просто не нужно, поэтому вы могли бы сосредоточиться на объяснении наложенных субпарантов, вместо этого сначала говорили о несоответствующей группе, которая не нужна;) – hakre

+0

Я так не думаю, что тег с разным «типом» может совпадать с шаблоном –

+0

Нет, только весь шаблон может совпадать. Это видео или изображение, а другое нет. Группа 0 имманентна, вам не нужно явно ее создавать (всегда весь шаблон, в идеале use() в качестве внешней скобки вместо //). Попробуйте. – hakre

Смежные вопросы