结合两个 preg_match 从 url 获取 vimeo id 和 youtube id

Combine two preg match to get viemo id and youtube id from url

我有一个可以嵌入 vimeo 视频或 youtube 视频的客户端。 所以我想写一个从 url .

获取 id 的正则表达式

这是我所做的:

 $y = '%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i';
 $v = '(https?:\/\/)?(www\.)?(player\.)?vimeo\.com\/([a-z]*\/)*([0-9]{6,11})[?]?.*';
 preg_match(($y) | ($v), $markup, $match);
 $markup = preg_replace('#\<iframe(.*?)\ssrc\=\"(.*?)\"(.*?)\>#i', '<iframe src="&loop=1&amp;playlist='.$match[1].'">', $markup);

但它给了我一个错误:

Warning: preg_match(): Unknown modifier '|' in

有什么想法吗? 提前致谢

您不能像在 preg_match($rx1 || $rx2, $text) 中那样使用 OR 正则表达式模式,您应该使用带有 | 分隔选项的单个正则表达式。但是,这里可能会变得太棘手,因为您需要捕获特定的组。您可以使用 branch reset group ((?|...|...) where alternatives retain grouping IDs) or \K operator(省略到目前为止匹配的文本):

'~(?|(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})|vimeo\.com/(?:[a-z]+/)*([0-9]{6,11}))~'

regex demo。或者用 \K:

'~(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)\K[^"&?/ ]{11}|vimeo\.com/(?:[a-z]+/)*\K[0-9]{6,11}~'

another regex demo

PHP code:

$rx = '~(?|(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})|vimeo\.com/(?:[a-z]+/)*([0-9]{6,11}))~';
$s = 'https://vimeo.com/341989332 or https://www.youtube.com/watch?v=eUMbH6X_Adc';
if (preg_match_all($rx, $s, $m)) {
    print_r($m[1]);
}
// => Array ( [0] => 341989332    [1] => eUMbH6X_Adc )