为什么我的regex按照预期进行匹配,但在最后显示其余内容


Why does my regex do the matching as expect, but shows the rest of the content at the end?

所以,我得到了这个代码:

function PCRT ($input) {
    if (preg_match('/youtube'.com'/watch'?v=([^'&'?'/]+)/', $input, $id)) {
        echo '1<pre>'; print_r($id); echo '</pre>';
    } else if (preg_match('/youtube'.com'/embed'/([^'&'?'/]+)/', $input, $id)) {
        echo '2<pre>'; print_r($id); echo '</pre>';
    } else if (preg_match('/youtube'.com'/v'/([^'&'?'/]+)/', $input, $id)) {
        echo '3<pre>'; print_r($id); echo '</pre>';
    } else if (preg_match('/youtu'.be'/([^'&'?'/]+)/', $input, $id)) {
        echo '4<pre>'; print_r($id); echo '</pre>';
    } else {   
        return 'no match';
    }
}
echo PCRT(' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec id tristique nisi. Praesent dolor nulla, auctor eu consequat quis, molestie non augue. Proin fermentum, metus et mattis convallis, lorem nunc posuere justo, sed posuere quam lacus ut felis. Vestibulum auctor ante sed eros pulvinar rutrum. Sed et pretium nisl. Suspendisse sed risus odio. Donec eu sodales est, vitae euismod justo. Cras tincidunt eros nisl, ac convallis lorem cursus nec. Nam malesuada, mi et dictum placerat, nulla nunc auctor dui, in sollicitudin metus purus non felis. Nulla lacinia pretium dolor, sit amet egestas lacus vulputate a. Integer sagittis libero justo, dignissim aliquet orci aliquet ut. Suspendisse a est ullamcorper libero vulputate bibendum eu eu massa. Phasellus nunc libero, gravida ac aliquet sed, pellentesque vel ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Mauris at mauris aliquam, consectetur nulla ac, tempus tortor. http://youtube.com/v/123456874145
Nunc tempor neque sed libero sodales, eu malesuada justo pretium. Integer ac dolor sit amet eros volutpat pulvinar. Cras pharetra accumsan metus. Proin at risus commodo sapien fermentum ullamcorper. Suspendisse ornare varius est, eget condimentum lectus sagittis vitae. Curabitur a massa nec ligula sodales fringilla. Morbi vestibulum rutrum risus. In sit amet turpis ut lacus dapibus posuere sed sit amet metus. Phasellus et posuere lacus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas vitae mi sit amet neque pharetra mollis. Mauris lorem est, luctus id leo nec, laoreet eleifend augue. Sed posuere nisl non nisl congue blandit a quis orci. Vestibulum sit amet magna sit amet turpis ultricies dictum. ');

现在问题是它的结果:

3
Array
(
    [0] => youtube.com/v/123456874145
Nunc tempor neque sed libero sodales, eu malesuada justo pretium. Integer ac dolor sit amet eros volutpat pulvinar. Cras pharetra accumsan metus. Proin at risus commodo sapien fermentum ullamcorper. Suspendisse ornare varius est, eget condimentum lectus sagittis vitae. Curabitur a massa nec ligula sodales fringilla. Morbi vestibulum rutrum risus. In sit amet turpis ut lacus dapibus posuere sed sit amet metus. Phasellus et posuere lacus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas vitae mi sit amet neque pharetra mollis. Mauris lorem est, luctus id leo nec, laoreet eleifend augue. Sed posuere nisl non nisl congue blandit a quis orci. Vestibulum sit amet magna sit amet turpis ultricies dictum. 
    [1] => 123456874145
Nunc tempor neque sed libero sodales, eu malesuada justo pretium. Integer ac dolor sit amet eros volutpat pulvinar. Cras pharetra accumsan metus. Proin at risus commodo sapien fermentum ullamcorper. Suspendisse ornare varius est, eget condimentum lectus sagittis vitae. Curabitur a massa nec ligula sodales fringilla. Morbi vestibulum rutrum risus. In sit amet turpis ut lacus dapibus posuere sed sit amet metus. Phasellus et posuere lacus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Maecenas vitae mi sit amet neque pharetra mollis. Mauris lorem est, luctus id leo nec, laoreet eleifend augue. Sed posuere nisl non nisl congue blandit a quis orci. Vestibulum sit amet magna sit amet turpis ultricies dictum. 
)

我想做的只是得到完整的链接和id,而不是其他内容。由于我在正则表达式方面还是很差。然后我不知道停止匹配的正确方法。我想,如果内容有多个链接,那么我也想得到它们。。只是Nunc tempor neque sed libero sodales...部分没有必要。

preg_match('/youtube'.com'/v'/([^'&'?'/]+)/', $input, $id)

本部分:

([^'&'?'/]+)

是匹配的部分。它正在寻找多个字符,这些字符不是(初始^否定范围)和号;问号;或斜线。因为这些字符都不在字符串的其余部分,所以它匹配所有字符,一直到最后。

要修复它,有几个选项:

preg_match('/youtube'.com'/v'/([^'&'?'/'s]+)/', $input, $id)

到达空格时将停止('s与空白匹配,其中还包括制表符和换行符)

preg_match('/youtube'.com'/v'/('d+)/', $input, $id)

只匹配数字('d匹配数字)-我不知道YouTube ID是否总是数字,但你的示例ID是。

编辑

有几种方法可以使其更加灵活;您可以使用regex来完成此操作,但这些操作会使它更加复杂。相反,我建议运行$inputstr_replace,这样它就会去掉你不确定的URL部分:

$input = str_replace ('http://', '', $input);       // remove http://
$input = str_replace ('https://', '', $input);      // ... and https://
$input = str_replace ('www.', '', $input);          // ... and www.

这将在$input中留下一个格式正确的字符串,然后可以正常解析。