结合两个 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&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}~'
$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 )
我有一个可以嵌入 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&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}~'
$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 )