регулярки: замена ссылки на ютуб
Гулял по форуму в поисках примеров регулярных выражений и наткнулся на один пост от maxmaxmaximus-а (выкинул из его поста всё лишнее оставил саму задачу)
Цитата:
<div id="text" style="height: 50px"> </div> <script> var str = "http://youtube.com бла-бла-бла youtu.be/wUQfvbBRnZs бла-бла-бла http://www.youtube.com/watch?v=wUQfvbBRnZs http://youtu.be" ; var poisk = /((?:http:\/\/)?(?:www\.)?youtube\.com\/watch\?v=(?=[-_0-9a-z]{11}))|((?:http:\/\/)?(?:www\.)?youtu\.be\/(?=[-_0-9a-z]{11}))/ig ; var pat = str.replace(poisk, '') ; window.onload = function() { document.getElementById('text').innerHTML = pat ; } ; </script> Не 'коряво' я это реализовал? Можно это сделать короче или нет |
Во-первых, в регулярке вы забыли закрыть скобку, во-вторых, флаг "m" там не нужен. Вместо (?=[%0-9a-z]+\b) можно просто (?=[%0-9a-z]), что не равносильно, но, мне кажется, то что вы хотели.
|
oneguy,
я уже сам увидел и исправил =) или где-то еще забыл? m - да пох на него)) а если сделать как вы написали, то там будет смотреть только один знак после youtube.com/, а я сделал наверняка, чтоб просматривал все, но в принципе, канеш, можно и так =) |
Цитата:
|
oneguy, ну в принципе да :)
|
Дзен-трансгуманист, спасибо, поправлю код =) но у меня, когда я вбил в гугле 'видео ютуб', были именно те 2 ссылки...без 'watch' и идентификатор не из 11символов почему-то...хотя, может, это и не идентификатор
__________ Всё исправил, теперь норм? __________ И если всё правильно, поставьте мне какую-нить задачку с регулярками, если вам не сложно =) |
кто-нибудь может дать какую-нить задачку с регулярками или ссылку, где задачу(-и) можно посмотреть, но не слишком сложную, еси можна
|
Hekumok,
А приведите пару-тройку входных строк и пару выходных для них же ? Чот пока слабо вкурил |
Deff,
<div id="text" style="height: 50px"> </div> <script> var str = "новый видос погляди : \n\n полный вид ссылки : http://www.youtube.com/watch?v=y-Q49kLd7EA \n без протокола : www.youtube.com/watch?v=y-Q49kLd7EA \n без www : youtube.com/watch?v=y-Q49kLd7EA \n с двумя слешами : //youtube.com/watch?v=y-Q49kLd7EA \n параметр ИД не первый : youtube.com/watch?feature=relmfu&v=y-Q49kLd7EA \n короткий вид ссылки : youtu.be/y-Q49kLd7EA \n ссылки с мусором : youtube.com/watch?v=y-Q49kLd7EA&feauture=youtu.be \n youtube.com/watch?v=y-Q49kLd7EA#t=5s \n ссылка с верхним регистром : YOUTUBE.COM/WATCH?V=Y-Q49KLD7EA" ; var poisk = /(?:(?:http:)?(?:\/\/)?(?:www\.)?youtube\.com\/watch\?\S*?v=([-_0-9a-z]{11})\S*)|(?:(?:http:)?(?:\/\/)?(?:www\.)?youtu\.be\/\S*?([-_0-9a-z]{11})\S*)/ig ; var pat = str.replace(poisk, function(а, b, c) {return (b||c)}) ; window.onload = function() { document.getElementById('text').innerHTML = pat ; } ; </script> ещё? :) |
Hekumok,
Ясн! |
Deff, ну и?
|
кто-нибудь подкиньте задачку с регулярками
|
<script type="text/javascript"> var str = []; str[0] = "Вот просто ссылка на ютуб http://youtube.com - она так и останется, и эта тоже - youtu.be/" ; str[1] = "A от этой останется только айдишник - http://youtu.be/wUQfvbBRnZs" ; str[2] = "И от этой тоже - www.youtube.com/watch?v=wUQfvbBRnZs" ; function ReturnYoutubId(str) { var Mass ="http://youtu.be/,www.youtube.com/watch?v="; Mass = Mass.split(",");//alert(Mass); var Out = ""; for(var i=0; i<Mass.length; i++){ var reg = new RegExp(".*?"+Mass[i].replace(/\?/ig,'\\?')+"(\\S*?\\S(?=\\s|$))","ig"); var st2 = str.replace(reg,',$1'); if(st2!= str){Out+=st2;str=str.replace(st2,'');} } return Out.substring(1).split(",");; } for(var i=0; i<str.length; i++){ alert(ReturnYoutubId(str[i])) } </script> |
var a = [ "Вот просто ссылка на ютуб [url]http://youtube.com[/url] - она так и останется, и эта тоже - youtu.be/", "A от этой останется только айдишник - http://youtube.ru/wUQfvbBRnZs", "И от этой тоже - www.youtube.com/watch?v=qwUQfvbBRnZs" ]; for( var i = 0; i < a.length; i++ ) { alert( a[i].replace( /(?:(?:https?:\/\/)?.*?\.(?:ru|com)\/(?:watch\?v=)?([\w]*)|(.*))/gi, "$1" ) ); } |
var a = [ "Вот просто ссылка на ютуб http://youtube.com - она так и останется, и эта тоже - youtu.be/", "A от этой останется только айдишник - http://youtube.ru/wUQfvbBRnZs hsdfhjg https://youtube.ru/wUQfvbBRnZs", "И от этой тоже - www.youtube.com/watch?v=qwUQfvbBRnZs И от этой тоже - www.youtube.com/watch?v=qwUQfvbBRnZs" ]; for( var i = 0; i < a.length; i++ ) { alert( a[i].replace( /(?:https?:\/\/)?[^\s]+\.(?:ru|com|be)\/(?:watch\?v=)?([\w]+)/gi, "$1" ) ); } |
как меня раздражает эта система автоматического проставления тега [url] в сылках указанных в тегах [js]
|
:write: Работает!
|
Дзен-трансгуманист, сделано :)
Deff, у вас код ведь длиннее моего, а чем он лучше - я так и не въехал... P.S. Тормоз я, наверно... devote, а зачем в обоих ваших кодах (в конце кодов) \w заключать в квадратные скобки, и без них же работает вроде, не? |
Hekumok,
:) А у меня ссылки мон менять и не на ютуб , просто в массиве иные или дополнить/уточнить новыми вариантами А у devote зато может парсить несколько ссылок в одной строке |
Deff, a понятно...но у мну же, как и у devote, может несколько ссылок в одной строке парсить - см. пост 10
|
Цитата:
|
devote, ясно :) а вы не знаете, где можно посмотреть какие-нить задачки с регулярками? Или сами какую-нибудь мне подкиньте :) потренироваться просто хочу с ними...
|
я бы сделал так :
(рега очень корявая :) долго мучися с "мусором". вроде бы ловит все варианты) var reg = new RegExp( // ссылка начинается с протокола и с www, или с "//", или с ничего :). "(?:" + "(?:" + "\\/\\/" + // я чуть про них не забыл :) ")|(?:" + "(?:http:\\/\\/)?" + // необязательны "(?:www\\.)?" + ")" + ")" + // дальше домен "(?:" + // у нас 2 варианта - короткий и полный. можно сделать через "|" "(?:" + "youtube\\.com\\/watch\\?" + // полный вид ссылки на видео "(?:.+?&)?" + // "v" может быть не первым - порядок параметров неважен "v=" + // параметр, определяющий ИД видео ")|(?:" + "youtu\\.be\\/" + // теперь короткий вариант ")" + ")" + // после этого идёт ИД видоса. "([a-z0-9-]+)" + // после ИДа - мусор "[^\\s\\n\\t]+", // текст мультистрочен, ссылки не имеют регистра, ищём всё "img" ); var text = "новый видос погляди : \n\n полный вид ссылки : http://www.youtube.com/watch?v=y-Q49kLd7EA \n без протокола : www.youtube.com/watch?v=y-Q49kLd7EA \n без www : youtube.com/watch?v=y-Q49kLd7EA \n с двумя слешами : //youtube.com/watch?v=y-Q49kLd7EA \n параметр ИД не первый : youtube.com/watch?feature=relmfu&v=y-Q49kLd7EA \n короткий вид ссылки : youtu.be/y-Q49kLd7EA \n ссылки с мусором : youtube.com/watch?v=y-Q49kLd7EA&feauture=youtu.be \n youtube.com/watch?v=y-Q49kLd7EA#t=5s \n ссылка с верхним регистром : YOUTUBE.COM/WATCH?V=Y-Q49KLD7EA"; alert( text ) alert( text.replace(reg, "$1") ); Deff : var str = ["полный вид ссылки : http://www.youtube.com/watch?v=y-Q49kLd7EA ", " без протокола : www.youtube.com/watch?v=y-Q49kLd7EA ", " без www : youtube.com/watch?v=y-Q49kLd7EA ", " с двумя слешами : //youtube.com/watch?v=y-Q49kLd7EA ", " параметр ИД не первый : youtube.com/watch?feature=relmfu&v=y-Q49kLd7EA ", " короткий вид ссылки : youtu.be/y-Q49kLd7EA ", " ссылка с мусором : youtube.com/watch?v=y-Q49kLd7EA&feauture=youtu.be ", "ссылка с мусором : youtube.com/watch?v=y-Q49kLd7EA#t=5s ", " ссылка с верхним регистром : YOUTUBE.COM/WATCH?V=Y-Q49KLD7EA"] function ReturnYoutubId(str) { var Mass ="http://youtu.be/,www.youtube.com/watch?v="; Mass = Mass.split(",");//alert(Mass); var Out = ""; for(var i=0; i<Mass.length; i++){ var reg = new RegExp(".*?"+Mass[i].replace(/\?/ig,'\\?')+"(\\S*?\\S(?=\\s|$))","ig"); var st2 = str.replace(reg,',$1'); if(st2!= str){Out+=st2;str=str.replace(st2,'');} } return Out.substring(1).split(",");; } for(var i=0; i<str.length; i++){ alert(ReturnYoutubId(str[i])) } devote : var a = ["полный вид ссылки : http://www.youtube.com/watch?v=y-Q49kLd7EA ", " без протокола : www.youtube.com/watch?v=y-Q49kLd7EA ", " без www : youtube.com/watch?v=y-Q49kLd7EA ", " с двумя слешами : //youtube.com/watch?v=y-Q49kLd7EA ", " параметр ИД не первый : youtube.com/watch?feature=relmfu&v=y-Q49kLd7EA ", " короткий вид ссылки : youtu.be/y-Q49kLd7EA ", " ссылка с мусором : youtube.com/watch?v=y-Q49kLd7EA&feauture=youtu.be ", "ссылка с мусором : youtube.com/watch?v=y-Q49kLd7EA#t=5s ", " ссылка с верхним регистром : YOUTUBE.COM/WATCH?V=Y-Q49KLD7EA"] for( var i = 0; i < a.length; i++ ) { alert( a[i].replace( /(?:(?:https?:\/\/)?.*?\.(?:ru|com)\/(?:watch\?v=)?([\w]*)|(.*))/gi, "$1" ) ); } |
melky,
ну я собственно и не старался, я понятия не имею какие там ссылки бывают на ютубе. Ну а если бы задался решением, решил бы без проблем. |
Цитата:
|
Цитата:
|
melky, супер :) щас постараюсь свою доделать, чтоб тож все эти ссылки парсила...у мну ток ссылки с мусором не ловит...и, ксать, никогда не видел, чтоб ссылка с двух слешей // начиналась О.о
|
Цитата:
Цитата:
Цитата:
|
урааааааа! Я сделал это! См. пост #10
Проблему с двойным слешем и где id не первый решил легко, а вот с мусором, как и вы, помучался...блин, я там чё тока не пробовал!))) |
Hekumok,
В методев с массивом регеспов, - чем хорошо - не нужно мучацо- измудряцо - воткнул варианты ссылок - если нужно - дополнил по ходу... |
Deff, ну я это и не отрицал вроде :) я просто сказал, что у мну может, как и у devote, несколько ссылок в строке парсить
|
Hekumok,
Мну без претензий - прост оцениваю топик для себя вслух |
Deff, a ясень)))
|
блин, дайте кто-нить задачку, а! С ВВ-кодами уже натренировался, хочется чего-то еще поделать с регулярками! Ну пожаааалуйстооо! Дайте задачку! Люююююди!
|
Цитата:
|
Цитата:
Написать функцию транслитерации русского текста - латиницей и наоборот |
Цитата:
Цитата:
alert( /(\S)\1/.test( 'я мыл ррррамУУУУУУ, яГГа' ) ); alert( /(\S)\1/.test( 'я мыл рамУ, яГа' ) ); |
nerv_, это легкотня :) остальные сделаете?
прошу ложить код под хайд. |
melky, боюсь, что я не справлюсь с п.5
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 21:23. |