Помощь PHP с шаблонами preg_match и regex - PullRequest
2 голосов
/ 06 августа 2011

Это сердце моего плагина, который я кропотливо разрабатывал.Хотя я столкнулся с некоторыми проблемами с шаблонами ..

<?php

$s = '
<embed type="application/x-shockwave-flash" id="single2" name="single2" src="http://api.realitylapse.com/player.swf" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" flashvars="file=http://cerium.realitylapse.com/stream/bea352a230ebd36b52dc27d874f41f5a/4e3c5eca/default/xxxxx/xxxxx-lq.mp4&amp;plugins=ltas&amp;ltas.cc=inhldvymihzxqln&amp;provider=http" height="424" width="659">

<embed type="application/x-shockwave-flash" src="http://www.xxxxx.com/player9397/player.swf?" quality="high" allowfullscreen="true" allowscriptaccess="always" wmode="opaque" flashvars="provider=http&amp;file=http://www.xxxxx.com/player9397/vb.php?id=TT175YivmF4y&amp;type=video&amp;backcolor=111111&amp;frontcolor=cccccc&amp;lightcolor=DE4949&amp;stretching=fill" height="420" width="99%">

<embed src="http://www.megavideo.com/v/xxxxxx" type="application/x-shockwave-flash" allowfullscreen="true" width="100%" height="438">    
';


$patterns = array();
//$patterns[] = '<embed[^>]+src=["\']+flashvars=["\'](.*?)["\']'; //Tried this one, but it only works with Cerium and without the pattern below it.
$patterns[] = '<embed[^>]+src=["\'](.+?)["\']';   //Too greedy..? Without it, ones like megavideo wont be grabbed.
$patterns[] = '<embed[^>]+data=["\'](.+?)["\']';  
$patterns[] = '<embed[^>]+flashvars="(.+?)["\']'; //Possible problem..
$patterns[] = '<embed[^>]+file=(.+?)[&]';         //
$patterns[] = '<iframe[^>]+src=["\'](.+?)["\']';
$patterns[] = '<iframe[^>]+data=["\'](.+?)["\']';
$patterns[] = '<object[^>]+src=["\'](.+?)["\']';
$patterns[] = '<object[^>]+data=["\'](.+?)["\']';
$patterns[] = '<video[^>]+src=["\'](.+?)["\']';
$patterns[] = '<video[^>]+data=["\'](.+?)["\']';
$patterns[] = '<video[^>]+file=(.+?)[&]';



$patterns = "#(?:" . implode("|", $patterns) . ")#si";

preg_match_all($patterns, ($s), $m);
//var_dump($m);
if (!empty($m[0]))
{ 
    $edata = array();
    foreach($m[0] as $match)
    { 

//Embeds:
if (preg_match('#realitylapse.com/stream/(.+?)[&,"\']#si', $match, $id))
     $edata[] = "<!--nextpage--><!--tab_title:CERIUM-->\n[cerium " . $id[1] . "]";

else if (preg_match('#http&amp;file=http://www.xxxx.com/player9397/vb.php?id=(.+?)[&,"\']#si', $match, $id))
     $edata[] = "<!--nextpage--><!--tab_title:UNKNOWN-->\n[vb " . $id[1] . "]";

else if (preg_match('#http://www.megavideo.com/v/(.+)[&"\']#si', $match, $id))
     $edata[] = "<!--nextpage--><!--tab_title:MEGAVIDEO-->\n[megavideo " . $id[1] . "]";

    }

if (isset($edata[0])) {

$embeds = implode("\n", ($edata)); 

print $embeds;

}
    } 

?>

Это выводит только:

[megavideo P5X0UOA267fb79acd04cdb29a057c3fa0066573a1]

Каждый другой игрок вставляет у меня совпадения.Все, что находится в области flashvars, нет.... Что-то вроде встраивания мегавидео.Что касается использования парсера HTML, то, скорее всего, уже слишком поздно .. Кроме того, я бы предпочел быть пуристом, если смогу помочь.Я ценю любую помощь, спасибо!

.. Надеюсь, кое-что из этого имеет смысл.Объясняя;не очень хорошо в этом.Шаблоны, кажется, перекрывают друг друга, в лучшем случае...Целью является вывод всех трех из этих совпадений, если это возможно.

-edit-

Шаблон $patterns[] = '<embed[^>]+flashvars="(.*?)["\']';, похоже, собирает два встраивания после всех ..

[1]=>
array(3) {
[0]=>
string(174) "file=http://cerium.realitylapse.com/stream/bea352a230ebd36b52dc27d874f41f5a/4e3c5eca/default/xxxxx/xxxxx-lq.mp4&amp;plugins=ltas&amp;ltas.cc=inhldvymihzxqln&amp;provider=http"
[1]=>
string(177) "provider=http&amp;file=http://www.xxxxx.com/player9397/vb.php?id=TT175YivmF4y&amp;type=video&amp;backcolor=111111&amp;frontcolor=cccccc&amp;lightcolor=DE4949&amp;stretching=fill"
[2]=>
string(0) ""

Это заставляет меня задуматься о том, что вызывает проблему ...

-edit-

Не важно, я заставил его работать!Хотя точно не знаю как.

1 Ответ

0 голосов
/ 06 августа 2011

Проблема с вашим методом заключается в том, что два вложения имеют оба атрибута: src и flashvars.В обоих случаях src является первым и, следовательно, будет сопоставляться первым.

В зависимости от структуры вашего источника (например, src всегда перед flashvars? Возможны другие атрибуты), вы можетеиспользуйте несколько подходов:

A) Сначала попробуйте наиболее ограничительное регулярное выражение (т.е. в данном случае flashvars) и, если оно подходит, обработайте содержимое.В противном случае попробуйте следующий (например, ищите src).

B) Вы можете построить отрицательное регулярное выражение (будет довольно сложным и почти нечитаемым), чтобы соответствовать src, только если нет flashvarsв комплекте.

C) Разобрать все атрибуты внутри тега embed и обработать их в цикле.

...