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

Romych 28.06.2010 21:40

я решил продолжить работу с этим скриптом и сделать некое подобие универсального тега [video], чтоб работал с прямыми ссылками на популярные видеоресурсы,
в данный момент скрипт обрабатывает ссылки для :
youtube.com
rutube.ru
vimeo.com
dailymotion.com
и smotri.com

запнулся на vids.myspace.com

вот собственно скрипт

<script type="text/javascript">
var vide, html;
var div = document.getElementsByTagName("div")
for( i=0; i < div.length; i++ )
{
if(div[i].className == 'postcolor')
{
if(div[i].innerHTML.indexOf("[video]")!=-1 && div[i].innerHTML.indexOf("[/video]")!=-1)
{
html = div[i].innerHTML;
if (html.indexOf('smotri.com')) {
vide = /\\[video\\]http:\\/\\/(.*?)\\/video\\/view\\/\\?id=(.*?)\\[\\/video\\]/g
html = html.replace(vide, "<br><embed src='http://pics.$1/scrubber_custom8.swf?file=$2&bufferTime=3&autoStart=false&str_lang=rus&xmlsource=http://pics.$1/cskins/blue/skin_color_lightaqua.xml&xmldatasource=http://pics.$1/skin_ng.xml' quality='high' allowscriptaccess='always' allowfullscreen='true' wmode='opaque'  width='400' height='300' type='application/x-shockwave-flash'></embed><br>")
  }
if (html.indexOf('youtube.com')) {
vide = /\\[video\\]http:\\/\\/(.*?)\\/watch\\?v=([^\\[]{11,110})\\[\\/video\\]/g
html = html.replace(vide, "<br><embed src='http://$1/v/$2' type='application/x-shockwave-flash' wmode='transparent' allowfullscreen='true' allowscriptaccess='always' flashvars='fs=1&rel=0' width='425' height='350'></embed><br>")
  }
if (html.indexOf('rutube.ru')) {
vide = /\\[video\\]http:\\/\\/(.*?)\\/tracks\\/([^\\[]{1,20})\\.html\\?v=([^\\[]{11,50})\\[\\/video\\]/g
html = html.replace(vide, "<br><embed src='http://video.$1/$3' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed><br>")
  }
if (html.indexOf('vimeo.com')) {
vide = /\\[video\\]http:\\/\\/(.*?)\\/([^\\[]{1,10})\\[\\/video\\]/g
html = html.replace(vide, "<br><embed src='http://$1/moogaloop.swf?clip_id=$2&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;fullscreen=1' type='application/x-shockwave-flash' wmode='transparent' allowfullscreen='true' allowscriptaccess='always' width='400' height='300'></embed><br>")
 }
if (html.indexOf('dailymotion.com')) {
vide = /\\[video\\]http:\\/\\/(.*?)\\/video\\/([^\\[]{6,110})\\[\\/video\\]/g
html = html.replace(vide, "<br><embed src='http://$1/swf/video/$2' type='application/x-shockwave-flash' wmode='transparent' width='480' height='360' allowfullscreen='true'></embed><br>")
 }
div[i].innerHTML = html}}}
</script>


для myspace.com сделать работу с цифровыми окончаниями от ссылки не проблема
получается по той же схеме как с youtube в первом посте
выглядит так:

<script type="text/javascript">
  var mys, html, result;
  var div = document.getElementsByTagName("div")
  for( i=0; i < div.length; i++ )
  {
  if(div[i].className == 'postcolor')
  {
  if(div[i].innerHTML.indexOf("[myspace]")!=-1 && div[i].innerHTML.indexOf("[/myspace]")!=-1)
  {
    html = div[i].innerHTML;
    mys = /\\[myspace\\](.*?)\\[\\/myspace\\]/g
    result = html.replace(mys, "<br><embed src='http://mediaservices.myspace.com/services/media/embed.aspx/m=$1,t=1,mt=video,searchID=,primarycolor=,secondarycolor=' width='425' height='360' allowFullScreen='true' type='application/x-shockwave-flash' wmode='transparent'/></embed><br>")
  
    div[i].innerHTML = result}}}
</script>


но как только пытаюсь сделать работу с прямой ссылкой,
(которые выглядят так
http://vids.myspace.com/index.cfm?fu...id=10554 7198
http://vids.myspace.com/index.cfm?fu...id=10552 4453)
начинается фигня

вот регулярка
Цитата:

mys = /\\[myspace\\]http:\\/\\/vids\\.myspace\\.com\\/index\\.cfm\\?fuseaction=vids\\.individual&videoid =(.*?)\\[\\/myspace\\]/g

где что упустил?

(индексацию я потом прикручу, мне бы с прямыми ссылками разобраться)


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