【问题标题】:PHP Regular Expression to find the first youtube linkPHP正则表达式找到第一个youtube链接
【发布时间】:2019-04-25 14:57:21
【问题描述】:

我正在尝试找到一个表达式,以仅保留我在 $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

附: 最后两个链接合并

【问题讨论】:

  • $render 是不是一个由链接填充的字符串,每个链接之间用空格隔开?
  • 是的。除了最后两个之外,它们用空格分隔。它们结合在一起。
  • 如果你只想要第一个链接,为什么不简单地将explode() 放入一个数组中,获取第一个元素,并确认它是一个 youtube URL 呢?如果没有,请抓住下一个并重复。
  • 很抱歉没有正确描述我想要的东西。有可能包含和除链接之外的其他词。比如:$render="这里有一些文字youtube.com/watch?v=fJ9rUzIMcZQyoutube.com/watch?v=fJ9rUzIMcZQ这里有一些文字youtube.com/watch?v=fJ9rUzIMcZQhttps://www.youtube.com/…";

标签: php regex hyperlink youtube


【解决方案1】:

尝试限制正则表达式可以匹配的数量,这样它就不会溢出到下一个 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 demo

【讨论】:

  • 没问题@Varkoume,很乐意提供帮助:) 当你有时间时,请务必查看 StackOverflow tour
【解决方案2】:

在我看来,使用数字分隔符不是那么未来的证明,这也可以:

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

正向前瞻 "(?=(\s|\b|https?))" 将匹配(但不包括)分隔符空格或单词绑定,此外,它将识别带有 http(s 的新 URL 的开头) 并且不会匹配它,延迟加载将匹配较少的字符,直到链接末尾。 我还更改了集合,因为“\w”已经包含下划线。 如果明天 YT 决定制作 24 个字符的 URL,无论如何你都可以,直到后一部分仍然包含在集合中。 这涵盖了空格、换行符的所有情况,甚至可以识别附加的两个 URL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    相关资源
    最近更新 更多