1

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

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...那里的部分是不必要的。

4

1 回答 1

4
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 是否总是数字,但您的示例是。

编辑

有几种方法可以使它更灵活;你可以用正则表达式来做,但这会让它变得更复杂。我建议改为运行$inputthrough str_replace,因此它将删除您不确定的 URL 部分:

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

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

于 2013-07-19T17:00:48.727 回答