如何从preg_match_all获得随机结果?

时间:2010-01-25 14:35:42

标签: php regex wordpress arrays

(对不起,如果标题很无用)

我有这个功能从WordPress中的随机帖子中获取第一张图片。这很好用,但现在我需要它从所有匹配中选择一个随机图像,而不是第一个。 (我在query_posts循环中运行此函数以选择类别)

// Get first image in post
function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];

    //no image found display default image instead
    if(empty($first_img)){
        $first_img = "/images/default.jpg";
    }

    // Or, show first image.
    return $first_img;
}

所以,任何想法,链接,提示&amp;关于如何从匹配结果中选择随机结果的技巧?

3 个答案:

答案 0 :(得分:0)

匹配所有内容,然后使用array_rand()获得随机匹配。

假设您使用PREG_SET_ORDER标志和preg_match_all然后获得随机链接。

$randomImage = $matches[array_rand($matches)][0];

请务必注意array_rand()会返回一个随机密钥,而不是随机值。

答案 1 :(得分:0)

试试这个

// Get first image in post
function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);

    //no image found display default image instead
    if(!$output){
        $first_img = "/images/default.jpg";
    } //or get a random image
    else $first_img=$matches[1][array_rand($matches[1])];

    return $first_img;
}

答案 2 :(得分:0)

您应该可以使用array_rand()$matches数组中返回随机密钥。您可能需要更改从preg_match_all()获得的数组格式。

您可以使用PREG_PATTERN_ORDER然后将$matches[$x]传递给array_rand() - 其中$x是您想要的匹配组(0表示完全匹配,1表示第一个子组) 。在这种情况下,array_rand()会返回一个密钥,您可以使用$matches[$x][$rand_key]访问随机数据。

或者,使用PREG_SET_ORDER,您可以将$matches传递给array_rand(),然后使用返回的密钥访问匹配的任何子组。 $matches[$rand_key][$x]

请注意,您没有获得随机,而是将数组键变为随机值。正如其他人所指出的,您可以在访问阵列时直接使用array_rand()函数,这是一种简单的剪切/粘贴解决方案。但是,我希望这个更长的解释能够揭示代码的作用。