我正在使用包含此功能的WordPress插件,但插件开发人员的回复速度并不是特别快。
它应该从YouTube网址获取视频ID,但我得到的是#34;未定义的偏移:1"错误。是否存在我错过的编码错误?
这是功能:
function youtube_id_from_url($url) {
$pattern =
'%^# Match any youtube URL
(?:https?://)? # Optional scheme. Either http or https
(?:www\.)? # Optional www subdomain
(?: # Group host alternatives
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com
(?: # Group path alternatives
/embed/ # Either /embed/
| /v/ # or /v/
| /watch\?v= # or /watch\?v=
) # End path alternatives.
) # End host alternatives.
([\w-]{10,12}) # Allow 10-12 for 11 char youtube id.
$%x'
;
$result = preg_match($pattern, $url, $matches);
if (false !== $result) {
return $matches[1];
}
return false;
}
我尝试使用print_r
查看数组$matches
的样子,它似乎只是一个空数组,所以我尝试回显$result
并返回0,其中意味着preg_match()
找不到匹配,对吗?如果是这样,我可以弄清楚$pattern
会导致它返回0的错误。
更新:
显然还有其他一些功能,它会获取URL并从中创建一个链接,然后将其保存为$url
变量。如果我回显$url
变量,则打印为<a href="youtube url">youtube url</a>.
这样可以解释错误但是如何修改正则表达式以适应html标记?
答案 0 :(得分:1)
preg_match将仅返回FALSE,在这种情况下,您可能想要知道是匹配还是没有匹配。所以你应该可以换行:
if (false !== $result) {
到
if ( isset( $matches[1] ) ) {
或
if ( $result && isset( $matches[1] ) ) {
菲尔指出,你真正需要的只是:
if( $result ) {
完全修订的功能完成了Phil对正则表达式的修改:
function youtube_id_from_url($url) {
$pattern =
'%^# Match any youtube URL
(?:https?://)? # Optional scheme. Either http or https
(?:www\.)? # Optional www subdomain
(?: # Group host alternatives
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com
(?: # Group path alternatives
/embed/ # Either /embed/
| /v/ # or /v/
| /watch\?v= # or /watch\?v=
) # End path alternatives.
) # End host alternatives.
([\w-]{10,12}) # Allow 10-12 for 11 char youtube id.
&?.*$%x'
;
$result = preg_match($pattern, $url, $matches);
if ($result) {
return $matches[1];
}
return false;
}