PHP preg_match模式 - 小问题


PHP preg_match pattern - Small issue

我需要一种匹配的模式

youtube.com/watch?v=iNAMI8DQc8M

youtu.be/iNAMI8DQc8M

它应该返回视频ID,在本例中为iNAMI8DQc8M

我尝试了这种模式:

youtu[.*][be|be'.com]'/+(.+)

但这行不通,我对正则表达式不是很好。

$str = 'youtube.com/watch?v=iNAMI8DQc8M';
$id = get_id($str);
function get_id($str) {
    $matches = array();
    if (preg_match('/youtu'.?be'/?('.com'/watch'?v=)?(['w]+)/', $str, $matches)) {
        $id = $matches[2];
    }
    return $id;
}

它非常宽容,但它有效。

我们知道无论如何优图都会在那里,所以它就在那里。 youtu

第一部分检查 . 之前是。它可能在那里,但不需要在那里。 '.?be

.com/watch?v= 部分也有一个检查,这也是不必要的,但可以。 ('.com'/watch'?v=)?

之后,我们匹配视频 ID。 (['w]+)

始终使用特定于您的问题的工具。在这种情况下是parse_url();

print_r( parse_url('http://' . $youtube); );

当有适合您的任务的解析器时,不鼓励使用正则表达式

这是正确的表达方式,根据用户 mts7 的答案更正。

/youtu'.?be'/?('.com'/watch'?v=)?/

我对正则表达式也不太了解。但在这种情况下,我使用了在线正则表达式验证器。您可以在此处检查此表达式是否有效:

http://www.regexr.com/39u0c