未定义的偏移量/ PHP错误

问题描述:

我正在使用一个包含此功能的WordPress插件,但插件开发人员并没有特别快速地做出响应。未定义的偏移量/ PHP错误

它应该得到一个YouTube网址的视频ID,而是我得到一个“未定义的偏移: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

UPDATE: 显然有这么走的是URL,使一个链接出来的,然后保存一些其他的功能,作为$url变量。如果我回显$url变量它打印为<a href="youtube url">youtube url</a>.

因此,这解释了错误,但我如何修改正则表达式,以适应html标记?如果发生错误,

+1

您可以添加导致错误的网址是什么? – FluffyKitten

+2

'preg_match'永远不会返回boolean'false'(除非有错误)。通常它返回一个'1'或'0'。该检查应该仅仅是'如果($结果){' – Phil

+0

工作对我来说很好(比@Phil说,其他):https://3v4l.org/eTvqp – ishegg

的preg_match只会返回FALSE,在这种情况下,你可能想知道是否有匹配或不匹配。所以,你应该能够切换线路:

if (false !== $result) { 

if (isset($matches[1])) { 

if ($result && isset($matches[1])) { 

菲尔指出的,你真正需要的是:

if($result) { 

菲尔的修改完整修改后的功能fication的正则表达式:

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; 
} 
+0

'$ matches'将始终设置(除非'preg_match'回报'FALSE')。如果'$ result'是* truthy *,你不需要检查'$ matches' – Phil

+0

$匹配可能总是被设置,但是$匹配[1]?显然不是,或者他不会得到那个错误。 –

+1

如果模式匹配任何内容,'$ matches'将会有两个元素,这是由于非可选捕获组 – Phil