2010-05-09 2 views
0

В моем форуме SMF есть сообщения с видео, и я хочу их отобразить на главной странице Wordpress. В моем текущем регулярном выражении (спасибо SO!) Извлекается URL-адрес видео, который я встраиваю с помощью AutoEmbed.Regexp для извлечения источников из разных видеороликов

Все работает до тех пор, пост выглядит так:

<embed height="600" width="600" allowscriptaccess="never" quality="high" loop="true" play="true" src="http://mmavlog.net/embed/player.swf?file=http://video.ufc.tv/CSG/UFC113/20100507_ufc113_weigh_in_400k.flv" type="application/x-shockwave-flash"> 

Вот мое текущее регулярное выражение:

$regexp = "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i"; 

Поскольку сообщения могут содержать <embed> или <object> Я понимаю, что ищет URL с помощью «http» может быть неточным. Как я могу использовать regexp для поиска «src =» для <embed> и «data =» для <object>?

ответ

1

Как не сделать это, даже если он работает:

$str = <<<HTML 
<object width="550" height="400"> 
    <param name="movie" value="somefilename.swf"> 
    <embed src="somefilename.swf" width="550" height="400"> 
    </embed> 
</object> 
HTML; 

$matches = array(); 
if (preg_match_all('/(src|value)="([^"]+)"/', $str, $matches)) { 
    print_r($matches); 
} 
// Array 
// (
//  [0] => Array 
//   (
//    [0] => value="somefilename.swf" 
//    [1] => src="somefilename.swf" 
//  ) 
// 
//  [1] => Array 
//   (
//    [0] => value 
//    [1] => src 
//  ) 
// 
//  [2] => Array 
//   (
//    [0] => somefilename.swf 
//    [1] => somefilename.swf 
//  ) 
// 
//) 

Как реально это сделать:

Это пример того, как разобрать HTML с simplehtmldom, и это что вы должны использовать вместо регулярных выражений (хотя вы можете использовать любой другой парсер HTML, а не строго simplehtmldom, большинство из них имеют аналогичный API).

<?php 
include('simple_html_dom.php'); 

$str = <<<HTML 
<object width="550" height="400"> 
    <param name="movie" value="somefilename.swf"> 
    <embed src="somefilename.swf" width="550" height="400"> 
    </embed> 
</object> 
HTML; 

$html = str_get_html($str); 
$embed = $html->find('embed', 0); 
echo $embed->src; 
// prints somefilename.swf 

$object = $html->find('object param', 0); 
echo $object->value; 
// prints somefilename.swf 
?> 
+0

Это может быть новичком вопрос, как я могу обрабатывать кавычки? У меня есть $ regexp = '(src | data) = "([^"] +) "' – Ben

+0

Здесь я немного расширил ответ, в том числе советы gurun8 и Delan Azabani, которые действительно так вы хотите пойти i –

+0

Awesome, это выглядит намного проще и эффективнее, чем регулярное выражение. Спасибо за обновление! – Ben

1

Рассматривали ли вы разбора HTML как XML (при условии, HTML хорошо сформированный) для извлечения узла и атрибутов данных, а не полагаться на регулярное выражение?

+0

Я не очень хорошо знаком с этим процессом, не могли бы вы указать мне в правильном направлении? – Ben

+0

Или проанализировать как синтаксический анализатор SGML/HTML5 , который предназначен для анализа HTML. –

+0

Привет, Бен! Мои извинения, я не видел ваших комментариев раньше. Вот ссылка XML XML DOM: http://www.w3schools.com/php/php_xml_dom.asp и это библиотека также выглядит интересной: http://simplehtmldom.sourceforge.net/ Предложение Delan также может быть полезно. Delan у вас есть полезная ссылка, которую вы могли бы порекомендовать? – gurun8

0

Для решения регулярное выражение:

/(?:src|data)="([^"]+)"/ 

Подсказка: избегать встраивания видео с embed и object - это так 2002. Попробуйте использовать более простой и более мощный video тег (который не требует никаких плагинов).

+1

Я бы хотел использовать видео, но не все браузеры поддерживают его еще ... – Ben

+0

Будете ли вы «не поддерживать IE» или «багги, небезопасные и небудетзащищенные технологии»? ;) –

+1

Ха, хороший ответ, но так как 60% + пользователей IE, я застрял до обновления. – Ben

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