使用strpos,检查给定的URL是否有';任何一个';数组中字符串的


Using strpos, check if given URL has 'any one' of the strings in the array?

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

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

我有一个主机列表(example.com),我想对照$url进行检查,看看其中是否有任何一个与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,如果列表中的任何一个主机与URL中的主机匹配。)

问题是您在循环中使用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>';
}

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

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
    }
}

(基于Jonathan Kuhn的回答和建议。)这样做:

<?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 );
?>

这似乎是我追求的更好的方式。