我正在尝试查找一个表达式,以仅保留我在$ render变量中找到的第一个youtube链接。
$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
P.S。 最后两个链接合并在一起
答案 0 :(得分:1)
尝试限制正则表达式可以匹配的数量,这样它就不会溢出到下一个网址中:
(?:https:\/\/www\.)?youtube\.com\/watch\?v=[\w_-]{1,11}
$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
答案 1 :(得分:0)
在我看来,使用数字定界符并不是很可靠的证明,这也可能会起作用:
(https):\/\/(www\.)?youtube.com\/watch\?v=[\w-].*?(?=(\s|\b|https?))
正向前瞻“(?=(\ s | \ b | https?))”将匹配(但不包括)定界符空格或单词边界,此外,它将识别带有http(s)的新URL的开头),并且不会与之匹配,延迟加载将匹配较少的字符,直到链接末尾。 我还更改了设置,因为“ \ w”已经包含下划线。 如果明天YT决定将URL设置为24个字符,那么您还是可以的,直到后一部分仍然包含在该字符集中。 这涵盖了所有空格,换行符的情况,甚至可以识别附加的两个URL。