Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   регулярки: замена ссылки на ютуб (https://javascript.ru/forum/misc/30183-regulyarki-zamena-ssylki-na-yutub.html)

Hekumok 27.07.2012 01:06

регулярки: замена ссылки на ютуб
 
Гулял по форуму в поисках примеров регулярных выражений и наткнулся на один пост от maxmaxmaximus-а (выкинул из его поста всё лишнее оставил саму задачу)
Цитата:

Сообщение от Mахmaxmaximus (Сообщение 159585)
потом напиши функцию чтобы она находила в тексте все такие ссылки на ютьюб, и заменяла их чисто айдишниками ютьюбовских видео.

Я сделал это так:
<div id="text" style="height: 50px">&nbsp;</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>

Не 'коряво' я это реализовал? Можно это сделать короче или нет

oneguy 27.07.2012 01:28

Во-первых, в регулярке вы забыли закрыть скобку, во-вторых, флаг "m" там не нужен. Вместо (?=[%0-9a-z]+\b) можно просто (?=[%0-9a-z]), что не равносильно, но, мне кажется, то что вы хотели.

Hekumok 27.07.2012 01:29

oneguy,
я уже сам увидел и исправил =) или где-то еще забыл?
m - да пох на него))
а если сделать как вы написали, то там будет смотреть только один знак после youtube.com/, а я сделал наверняка, чтоб просматривал все, но в принципе, канеш, можно и так =)

oneguy 27.07.2012 01:36

Цитата:

Сообщение от Hekumok
а если сделать как вы написали, то там будет смотреть только один знак после youtube.com/

В вашем варианте тоже, вы написали [%0-9a-z]+ - значит оно будет довольно даже одним знаком.

Hekumok 27.07.2012 01:48

oneguy, ну в принципе да :)

Hekumok 27.07.2012 09:17

Дзен-трансгуманист, спасибо, поправлю код =) но у меня, когда я вбил в гугле 'видео ютуб', были именно те 2 ссылки...без 'watch' и идентификатор не из 11символов почему-то...хотя, может, это и не идентификатор
__________
Всё исправил, теперь норм?
__________
И если всё правильно, поставьте мне какую-нить задачку с регулярками, если вам не сложно =)

Hekumok 27.07.2012 16:28

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

Deff 27.07.2012 19:09

Hekumok,
А приведите пару-тройку входных строк и пару выходных для них же ?
Чот пока слабо вкурил

Hekumok 27.07.2012 20:00

Deff,
<div id="text" style="height: 50px">&nbsp;</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>

ещё? :)

Deff 27.07.2012 21:21

Hekumok,
Ясн!

Hekumok 27.07.2012 21:36

Deff, ну и?

Hekumok 27.07.2012 23:02

кто-нибудь подкиньте задачку с регулярками

Deff 28.07.2012 01:32

<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>

devote 28.07.2012 01:50

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" ) );
}

devote 28.07.2012 02:01

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" ) );
}

devote 28.07.2012 02:05

как меня раздражает эта система автоматического проставления тега [url] в сылках указанных в тегах [js]

Deff 28.07.2012 02:15

:write: Работает!

Hekumok 28.07.2012 03:24

Дзен-трансгуманист, сделано :)
Deff, у вас код ведь длиннее моего, а чем он лучше - я так и не въехал... P.S. Тормоз я, наверно...
devote, а зачем в обоих ваших кодах (в конце кодов) \w заключать в квадратные скобки, и без них же работает вроде, не?

Deff 28.07.2012 03:29

Hekumok,
:) А у меня ссылки мон менять и не на ютуб , просто в массиве иные или дополнить/уточнить новыми вариантами
А у devote зато может парсить несколько ссылок в одной строке

Hekumok 28.07.2012 09:17

Deff, a понятно...но у мну же, как и у devote, может несколько ссылок в одной строке парсить - см. пост 10

devote 28.07.2012 09:26

Цитата:

Сообщение от Hekumok
а зачем в обоих ваших кодах (в конце кодов) \w заключать в квадратные скобки,

а хз... видимо с просто уже не соображал ничего вчера в это время.

Hekumok 28.07.2012 12:43

devote, ясно :) а вы не знаете, где можно посмотреть какие-нить задачки с регулярками? Или сами какую-нибудь мне подкиньте :) потренироваться просто хочу с ними...

melky 28.07.2012 21:22

я бы сделал так :

(рега очень корявая :) долго мучися с "мусором". вроде бы ловит все варианты)

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" ) );
}

devote 28.07.2012 21:33

melky,
ну я собственно и не старался, я понятия не имею какие там ссылки бывают на ютубе. Ну а если бы задался решением, решил бы без проблем.

melky 28.07.2012 21:36

Цитата:

Сообщение от devote
ну я собственно и не старался, я понятия не имею какие там ссылки бывают на ютубе. Ну а если бы задался решением, решил бы без проблем.

я ещё специально ID новый подобрал, с тире :) жаль.

devote 28.07.2012 21:38

Цитата:

Сообщение от melky
жаль.

жаль что не задавался вопросом? melky, я не фанатею от составления регулярок, знаю их давно еще до изучения JS. И как бы интерес был тогда когда их не знал, сейчас не тащусь от того что бы такое на них слепить. :)

Hekumok 28.07.2012 21:57

melky, супер :) щас постараюсь свою доделать, чтоб тож все эти ссылки парсила...у мну ток ссылки с мусором не ловит...и, ксать, никогда не видел, чтоб ссылка с двух слешей // начиналась О.о

melky 28.07.2012 22:35

Цитата:

Сообщение от devote
жаль что не задавался вопросом? melky, я не фанатею от составления регулярок, знаю их давно еще до изучения JS. И как бы интерес был тогда когда их не знал, сейчас не тащусь от того что бы такое на них слепить.

я тоже от них раньше не фанател, до того момента, как не увидел способ их описания, как у меня в примере - т.е. комментируя их по частям. от этого сразу интерес возрос, на время :) правда, иметь дело я с ними более-менее серьёзно начал в JS, отчего завидую Вам.

Цитата:

Сообщение от Hekumok
никогда не видел, чтоб ссылка с двух слешей // начиналась О.о

таки я тоже, но при составлении реги я на всякий это учитывал.

Цитата:

Сообщение от Hekumok
melky, супер щас постараюсь свою доделать, чтоб тож все эти ссылки парсила...у мну ток ссылки с мусором не ловит

я проблему с мусором решал дольше, чем саму регу составлял )

Hekumok 28.07.2012 22:51

урааааааа! Я сделал это! См. пост #10
Проблему с двойным слешем и где id не первый решил легко, а вот с мусором, как и вы, помучался...блин, я там чё тока не пробовал!)))

Deff 28.07.2012 23:10

Hekumok,
В методев с массивом регеспов, - чем хорошо - не нужно мучацо- измудряцо - воткнул варианты ссылок - если нужно - дополнил по ходу...

Hekumok 28.07.2012 23:18

Deff, ну я это и не отрицал вроде :) я просто сказал, что у мну может, как и у devote, несколько ссылок в строке парсить

Deff 28.07.2012 23:29

Hekumok,
Мну без претензий - прост оцениваю топик для себя вслух

Hekumok 28.07.2012 23:32

Deff, a ясень)))

Hekumok 29.07.2012 00:30

блин, дайте кто-нить задачку, а! С ВВ-кодами уже натренировался, хочется чего-то еще поделать с регулярками! Ну пожаааалуйстооо! Дайте задачку! Люююююди!

melky 29.07.2012 06:32

Цитата:

Сообщение от Hekumok
Дайте задачку! Люююююди!

  1. написать код, который бы проверял входную строку, и возвращал бы TRUE, если строка длиною до 15 символов и состоит из латинских символов.
  2. проверить с помощью реги, есть ли в строке одинаковые идущие подряд символы : "я мыл ррррамУУУУУУ, яГГа"
  3. написать сюда регу, при которой код бы возвращал то, что указано в комметарии : (флагов нет!)
    "я мыл раму мылом, амиго".match(/текст реги/).join(" "); // "я амиго"
    
  4. заменить с помощью replace тег title на div в тексте.
  5. сделать замену слов по словарю. словарь - обычный объект.
  6. не придумал пока.

Deff 29.07.2012 11:13

Цитата:

Сообщение от melky
не придумал пока.

Hekumok,
Написать функцию транслитерации русского текста - латиницей и наоборот

nerv_ 29.07.2012 11:39

Цитата:

Сообщение от melky
написать код, который бы проверял входную строку, и возвращал бы TRUE, если строка длиною до 15 символов и состоит из латинских символов.

/[a-z]{1,14}/i
Цитата:

Сообщение от melky
проверить с помощью реги, есть ли в строке одинаковые идущие подряд символы : "я мыл ррррамУУУУУУ, яГГа"

alert( /(\S)\1/.test( 'я мыл  ррррамУУУУУУ, яГГа' ) );
alert( /(\S)\1/.test( 'я мыл  рамУ, яГа' ) );

melky 29.07.2012 11:40

nerv_, это легкотня :) остальные сделаете?

прошу ложить код под хайд.

nerv_ 29.07.2012 11:42

melky, боюсь, что я не справлюсь с п.5
Цитата:

Сообщение от melky
не придумал пока.

:D

melky 29.07.2012 11:45

Цитата:

Сообщение от nerv_ (Сообщение 192637)
melky, боюсь, что я не справлюсь с п.5

:D

это уже шесть. да, это невыполнимое задание :)


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