Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение для youtube.com (https://javascript.ru/forum/misc/9949-regulyarnoe-vyrazhenie-dlya-youtube-com.html)

Romych 12.06.2010 15:55

Регулярное выражение для youtube.com
 
Приветствую!

есть скрипт позволяющий пользователям форума (движок IPB 1.3)
вставлять в посты ролики с youtube

var r, html, result;
var div = document.getElementsByTagName("div")
for( i=0; i < div.length; i++ )
{
if(div[i].className == 'postcolor')
{
if(div[i].innerHTML.indexOf("[youtube]")!=-1 && div[i].innerHTML.indexOf("[/youtube]")!=-1)
{
  html = div[i].innerHTML;
  r = /\\[youtube\\]([0-9a-zA-Z\\-\\_]{11})\\[\\/youtube\\]/g
  result = html.replace(r, "<embed src='http://www.youtube.com/v/$1' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed>")

  div[i].innerHTML = result}}}


НО работает скрипт только с окончаниями ссылок,
если ссылка такая http://www.youtube.com/watch?v=gAnhjo25udo,
то в теги пользователь вставляет окончание [youtube]gAnhjo25udo[/youtube]

я хотел облегчить своим пользователям задачу и переделать скрипт для работы с целой ссылкой
сначала подумал о методе slice() и извлекать из строки, то что идёт после v= , но ссылки могут быть видов:

http://www.youtube.com/watch?v=gAnhjo25udo
http://youtube.com/watch?v=gAnhjo25udo

поэтому от этого метода отказался

стал переписывать строку с регулярным выражением (в которых я практически ноль)
перепробовал много вариантов, пока ничего путного

вот к примеру один из вариантов
(экранирование идёт двойным бэк-слэшем \\, поскольку при сохранении один из них съедается)


Код:

r = /\\[youtube\\]\\http:\\/\\/|\\www\\.\\youtube.\\com\\/watch\\?\\v=([0-9 a-zA-Z\\-\\_]{11})\\[\\/youtube\\]/g
при таком варианте ввожу в пост форума теги с ссылкой на ролик

[youtube]http://www.youtube.com/watch?v=gAnhjo25udo[/youtube]

при сохранении поста получаю -
www.youtube.com/watch?v=gAnhjo25udo[/youtube]

т.е. [youtube]http:// как бы читается дальше никак (читается то, что до знака |, если его убрать, вообще ничего не читается, в посте будет просто [youtube]http://www.youtube.com/watch?v=gAnhjo25udo[/youtube] )

подскажите, что не так?
или может быть вообще другой путь избрать?

exec 12.06.2010 16:18

alert('[youtube]gAnhjo25udo[/youtube]'.replace(']', ']http://youtube.com/watch?v='));

haha 12.06.2010 16:20

r.slice( r.indexOf('v=')+2 )

рони 12.06.2010 16:43

может такой вариант сгодиться работает с
http://www.youtube.com/watch?v=gAnhjo25udo
http://youtube.com/watch?v=gAnhjo25udo

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
</head>
<body>
<script language="JavaScript" type="text/javascript">
 for(text="[youtube]http://youtube.com/watch?v=yl6j4xFvVdU[/youtube] [youtube]http://www.youtube.com/watch?v=ERAhCzkq3ds&feature=related[/youtube] [youtube]http://www.youtube.com/watch?v=sSgPDKG6bB0[/youtube]";text.search(/\[youtube\](.*?)\[\/youtube\]/g)>=0;){t=text.split("[youtube]");if(t[1]){t2=t[1].split("[/youtube]");if(t2[0]){var ss2009=t2[0].replace("watch?v=","v/");ss400='src="'+ss2009+'&hl=ru&fs=1"';text=text.replace("[youtube]"+t2[0]+"[/youtube]","<embed "+ss400+" type=application/x-shockwave-flash allowscriptaccess=always allowfullscreen=true width=280 height=245></embed>")}else text=
text.replace("[youtube]"+t2[0]+"[/youtube]","")}}document.write(text);
</script>
</body>
</html>

Riim 12.06.2010 19:28

Цитата:

Сообщение от haha
r.slice( r.indexOf('v=')+2 )

r.split('v=')[1]

Romych 16.06.2010 02:55

Подобрал я всё таки регулярное выражение, которое работает с ссылками такого вида:

http://www.youtube.com/watch?v=gAnhjo25udo

выражение получилось таким:

r = /\\[youtube\\]http:\\/\\/www\\.youtube\\.com\\/watch\\?v=([0-9a-zA-Z\\-\\_]{11})\\[\\/youtube\\]/g


теперь осталось добиться работы с ссылками вида:

http://youtube.com/watch?v=5pvXkmlaiBk

что посоветуете?

Gvozd 16.06.2010 03:25

Цитата:

Сообщение от Romych
что посоветуете?

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

qwoiejfoiej 16.06.2010 03:39

www\\. => (www\\.)?

рони 16.06.2010 05:33

доделал листинг в 4 посте сейчас можно кому интересно ролики с ютуба здесь посмотреть ))) работает с любыми ссылками с ютуба и с любым количеством тегов

Romych 16.06.2010 16:04

задача решена,
всем спасибо за помощь,
в итоге регулярное выражение получилось таким:

r = /\\[youtube\\]http:\\/\\/(www\\.){0,1}youtube\\.com\\/watch\\?v=([^\\[]{11,110})\\[\\/youtube\\]/g
result = html.replace(r, "<br><embed src='http://www.youtube.com/v/$2' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed><br>")


теперь все три разновидности ссылки читаются на ура

http://youtube.com/watch?v=ERAhCzkq3ds
http://www.youtube.com/watch?v=ERAhCzkq3ds
http://www.youtube.com/watch?v=ERAhC...eature=related


Часовой пояс GMT +3, время: 00:55.