使用strpos,检查给定的URL是否包含数组中的“任何一个”字符串?

时间:2013-12-03 20:32:46

标签: php arrays variables foreach strpos

我有一个变量$url(我无法控制),其值是一个URL(作为字符串)。例如:

$url = 'http://www.youtube.com/watch?v=rSnzy2dZtsE';

我有一个主机列表(example.com),我想根据$url检查,并查看其中任何一个是否与网址中的主机匹配。

我这样做:

<?php

function itsme_custom_oembed( $html, $url, $attr, $post_id ) {

    // Supported video embeds
    $hosts = array( 'blip.tv', 'money.cnn.com', 'dailymotion.com', 'flickr.com', 'hulu.com', 'kickstarter.com', 'vimeo.com', 'vine.co', 'youtube.com' );

    foreach( $hosts as $host ) {

        // check if it's a supported video embed
        if( strpos( $url, $host ) === false )
            return $html;

        return '<div class="flex-video">'. $html .'</div>';

    }

}
add_filter( 'embed_oembed_html', 'itsme_custom_oembed', 10, 4 );

?>

但它不起作用(即strpos( $url, $host )总是返回false),而且正如我所看到的,问题出在foreach构造上。特别是因为这有效:

<?php

    function itsme_custom_oembed( $html, $url, $attr, $post_id ) {

        // Supported video embeds
        $host = 'youtube.com';

        // check if it's a supported video embed
        if( strpos( $url, $host ) === false )
            return $html;

        return '<div class="flex-video">'. $html .'</div>';

    }
    add_filter( 'embed_oembed_html', 'itsme_custom_oembed', 10, 4 );

?>

显然,foreach并非用于此目的。

那么,我该怎么检查给定的URL是否有数组中任何一个的字符串? (即true如果列表中的任何一个主机与网址中的主机匹配。)

3 个答案:

答案 0 :(得分:3)

问题是你在循环中return。从函数return开始,函数停止。因此,您最终会检查循环中第一次运行的第一个值,并return停止函数检查后续迭代。

要修复它,您可以将第二个返回移动到循环外部。这将使函数循环遍历数组中的每个值,直到找到匹配为止。如果找到匹配,则退出函数(return)。如果没有找到匹配,它将在循环后点击返回。

function itsme_custom_oembed( $html, $url, $attr, $post_id ) {

    // Supported video embeds
    $hosts = array( 'blip.tv', 'money.cnn.com', 'dailymotion.com', 'flickr.com', 'hulu.com', 'kickstarter.com', 'vimeo.com', 'vine.co', 'youtube.com' );

    //loop over all the hosts
    foreach( $hosts as $host ) {

        // check if it's a supported video embed
        if( strpos( $url, $host ) === false )
            return $html;  //it was supported, so return from the original html from the function
    }

    //no hosts matched so return the original html wrapped in a div.
    return '<div class="flex-video">'. $html .'</div>';

}

答案 1 :(得分:0)

我不确定你想要什么,但你可以尝试使用它!

function itsme_custom_oembed( $html, $url, $attr, $post_id ) {

    $hosts = array('blip.tv', 'money.cnn.com', 'dailymotion.com', 'flickr.com', 'hulu.com', 'kickstarter.com', 'vimeo.com', 'vine.co', 'youtube.com');
    $success = false;

    foreach ($hosts as $host) {
        if (stripos($url, $host) !== false) {
            $success = true;
            break;
        }
    }

    if ($success) {
        // put your return when it DOES contain the host here
    }

    else {
        // put your return when it DOES NOT contain the host here
    }

}

答案 2 :(得分:0)

(基于Jonathan Kuhn's answersuggestions。)这样做:

<?php

function itsme_custom_oembed( $html, $url, $attr, $post_ID ) {

    // Supported video embeds
    $hosts = array( 'blip.tv', 'money.cnn.com', 'dailymotion.com', 'flickr.com', 'hulu.com', 'kickstarter.com', 'vimeo.com', 'vine.co', 'youtube.com' );

    foreach( $hosts as $host ) {

        // check if it's a supported video embed
        if( strpos( $url, $host ) !== false )
            return '<div class="flex-video">'. $html .'</div>';
        }

    }

    return $html;

}
add_filter( 'embed_oembed_html', 'itsme_custom_oembed', 10, 4 );

?>

然后一个想法让我震惊;我可以用更简单的方式做到这一点,比如:

<?php

function itsme_custom_oembed( $html, $url, $attr, $post_ID ) {

    // Supported video embeds
    $hosts = array( 'blip.tv', 'money.cnn.com', 'dailymotion.com', 'flickr.com', 'hulu.com', 'kickstarter.com', 'vimeo.com', 'vine.co', 'youtube.com' );

    foreach( $hosts as $host ) {

        // check if it's a supported video embed
        if( strpos( $url, $host ) !== false ) {
            $html = '<div class="flex-video">'. $html .'</div>';
            break;
        }

    }

    return $html;

}
add_filter( 'embed_oembed_html', 'itsme_custom_oembed', 10, 4 );

?>

似乎是一种更好的方式来做我想要的事情。