превращение этого регулярного выражения из PHP в TCL: - PullRequest
0 голосов
/ 09 марта 2020

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

preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match); 

я беру его отсюда:

<?php
// Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)

// http://youtu.be/dQw4w9WgXcQ
// http://www.youtube.com/embed/dQw4w9WgXcQ
// http://www.youtube.com/watch?v=dQw4w9WgXcQ
// http://www.youtube.com/?v=dQw4w9WgXcQ
// http://www.youtube.com/v/dQw4w9WgXcQ
// http://www.youtube.com/e/dQw4w9WgXcQ
// http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
// http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
// http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
// http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ

// It also works on the youtube-nocookie.com URL with the same above options.
// It will also pull the ID from the URL in an embed code (both iframe and object tags)

preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
$youtube_id = $match[1];
?>

1 Ответ

1 голос
/ 09 марта 2020

Языки Tcl и PHP RE очень похожи в этой области (есть области, где они расходятся, но этот RE не использует их). Поведение использования массива совпадений в PHP очень похоже на использование опции -inline для regexp и сохранение результата (списка) в переменной, которую затем можно проиндексировать (например, с помощью lindex). Оберточная часть %…%i кода PHP становится опцией -nocase. Наконец, вы захотите поместить RE в Tcl в { фигурных скобках }.

set match [regexp -inline -nocase {(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})} $url]
#"# This line is just for the broken code highlighter here on Stack Overflow
set youtube_id [lindex $match 1]

Мы можем разбить это на несколько строк для удобства чтения.

set RE {(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})}
#"# This line is just for the broken code highlighter here on Stack Overflow
set match [regexp -inline -nocase $RE $url]
set youtube_id [lindex $match 1]

Первый Здесь строка хранит регулярное выражение в переменной, а вторая строка применяет RE ко всему, что находится в переменной url, сохраняя полученный список в переменной match для дальнейшего изучения. Что является хорошим совпадением с тем, что preg_match делал в PHP.


Поскольку вы на самом деле хотите только идентификатор, это тоже просто:

set RE {(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})}
#"# This line is just for the broken code highlighter here on Stack Overflow
regexp -nocase $RE $url --> youtube_id

( --> на самом деле является фиктивным именем переменной, которому присваивается весь сопоставленный URL, но использование стрелки более мнемонически c.)

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