未定义的偏移/ PHP错误

时间:2017-08-18 03:34:23

标签: php wordpress preg-match

我正在使用包含此功能的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标记?

1 个答案:

答案 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;
}