Языки 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.)