Регулярное выражение PHP, чтобы найти первую ссылку на YouTube - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь найти выражение, чтобы оставить только первую ссылку на YouTube, найденную в переменной $ render.

$render="some text here https://www.youtube.com/watch?v=fJ9rUzIMcZQ https://www.youtube.com/watch?v=fJ9rUzIMcZQ some text here https://www.youtube.com/watch?v=fJ9rUzIMcZQhttps://www.youtube.com/watch?v=fJ9rUzIMcZQ";

$prefix = "https://www.youtube.com/watch?v=";
$index = strpos($render, $prefix) + strlen($prefix);
$youtube = substr($render, $index);
$youtube = strtok($youtube,' ');
$regex="@(https):\/\/(www\.)?youtube.com/watch\?v=[\w_-].* *@";
preg_match($string, $render, $matches, PREG_OFFSET_CAPTURE);
$render = preg_replace($regex, "", $render);
$render = substr_replace($render, $matches[0][0], $matches[0][1], 0);
echo $render;

Что я получу

https://www.youtube.com/watch?v=fJ9rUzIMcZQ  ://www.youtube.com/watch?v=fJ9rUzIMcZQ

Что я хочу получить

https://www.youtube.com/watch?v=fJ9rUzIMcZQ

PS Последние две ссылки объединены

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Использование числовых разделителей, на мой взгляд, не является доказательством будущего, это также может сработать:

(https):\/\/(www\.)?youtube.com\/watch\?v=[\w-].*?(?=(\s|\b|https?))

Позитивный прогноз "(? = (\ S | \ b | https?))"будет соответствовать (но не включать) пробел или ограничитель слова, кроме того, он распознает начало нового URL с http (s) и не будет совпадать с ним, ленивая загрузка будет соответствовать меньшему количеству символов до конца ссылки,Я также изменил набор, потому что "\ w" уже включает в себя подчеркивание.Если завтра YT решит сделать URL длиной 24 символа, все будет в порядке, пока последняя часть не останется включенной в набор.Это охватывает все случаи пробела, перехода на новую строку и даже распознавания двух прикрепленных URL-адресов.

0 голосов
/ 23 ноября 2018

Попробуйте ограничить количество регулярных выражений, чтобы оно не перетекло в следующий URL:

(?:https:\/\/www\.)?youtube\.com\/watch\?v=[\w_-]{1,11}

regex101 demo

$render = "some text here youtube.com/watch?v=fJ9rUzIMcZQ youtube.com/watch?v=fJ9rUzIMcZQ some text here youtube.com/watch?v=fJ9rUzIMcZQhttps://www.youtube.com/...";
preg_match('/(?:https:\/\/www\.)?youtube\.com\/watch\?v=[\w_-]{1,11}/', $render, $matches);
$render = $matches[0];
echo $render; // => youtube.com/watch?v=fJ9rUzIMcZQ

3v41.org демо

...