Регулярные выражения: использовать по MAX

Panchous

Павел
Регулярные выражения: использовать по MAX

Задача следующая...

Заменить в переменной $content (строка)
Код:
<a href="{любой_путь}[b].mpg[/b]">{что_угодно}</a>
на
Код:
<a href='javascript:win_video("{что_угодно}", "{любой_путь}.mpg")' class='blue_text'>[b]просмотреть[/b]</a>
и
Код:
<a href="{любой_путь}[b].mp3[/b]">{что_угодно}</a>
на
Код:
<a href='javascript:win_audio("{что_угодно}", "{любой_путь}[b].mp3[/b]")' class='blue_text'>[b]прослушать[/b]</a>

Как наиболее эффективно использовать здесь регулярные выражения?
Или без циклов и свитчей не обойтись?

Спасибо.
 

Profic

just Profic (PHP5 BetaTeam)
Думаю все же preg_split + цикл или preg_replace_callback будут лучше. Все равно голыми регулярками такой замены не сделаешь.
 

Yaguan

пилот
Все равно голыми регулярками такой замены не сделаешь.
Хм. А разве чем-то вроде
PHP:
$content = preg_replace('#<a href="([^"]+.mpg)">(.*?)</a>#','<a href="javascript:win_video("\2", "\1")" class="blue_text">просмотреть</a>', $content);
задачу не решить?
 

Profic

just Profic (PHP5 BetaTeam)
И так два раза?
Я понял, что автору вопроса хотелось бы сделать это одной регуляркой. Именно к этому случаю относится мое "голыми регулярками такой замены не сделаешь".
 

Yaguan

пилот
Ах, вот что.

Имхо, лучше все же провернуть два рега, чем наворачивать один либо вообще писать callback-функцию. Хотя бы в плане читабельности кода.
 

Panchous

Павел
Yaguan, спасибо!!!
Мне именно это и требовалось!!!
Вот конечный вариант:
Код:
[php]
$content = '<a href="file.mpg">fhfghfgh</a>gfhgfhghgj<a href="file.mp3">fhfghfgh</a> kdjghkdfgh kdjsgkd jh';

$video = array('avi', 'mpg');
$audio = array('mp3', 'wav');

$pattern = array();
$replace = array();

foreach ($video as $ext)
{
	$pattern[] = '#<a href="([^"]+.'.$ext.')">(.*?)</a>#';
	$replace[] = '<a href="javascript:win_video(\'\2\', \'\1\')" class="blue_text">смотреть</a>';
}

foreach ($audio as $ext)
{
	$pattern[] = '#<a href="([^"]+.'.$ext.')">(.*?)</a>#';
	$replace[] = '<a href="javascript:win_audio(\'\2\', \'\1\')" class="blue_text">слушать</a>';
}

print preg_replace($pattern,$replace, $content);
[/php]
 

Yaguan

пилот
Panchous
Можно циклы убрать, если записать все расширения в рег как альтернативы:
PHP:
$pattern[] = '#<a href="([^"]+\.(?:'.implode('|', $video).'))">(.*?)</a>#';
 

Panchous

Павел
Yaguan, спасибо еще раз!!!
Вот самый конечный вариант:
Код:
[php]
$content = '<a href="file.mpg">fhfghfgh</a>gfhgfhghgj<a href="file.mp3">fhfghfgh</a> kdjghkdfgh kdjsgkd jh';

$video = array('avi', 'mpg');
$audio = array('mp3', 'wav');

$pattern = array();
$replace = array();

$pattern[] = '#<a href="([^"]+\.(?:'.implode('|', $video).'))">(.*?)</a>#';
$replace[] = '<a href="javascript:win_video(\'\2\', \'\1\')" class="blue_text">смотреть</a>';
$pattern[] = '#<a href="([^"]+\.(?:'.implode('|', $audio).'))">(.*?)</a>#';
$replace[] = '<a href="javascript:win_audio(\'\2\', \'\1\')" class="blue_text">слушать</a>';

print preg_replace($pattern,$replace, $content);
[/php]
 
Сверху