1

我正在尝试向执行以下操作的 wordpress 站点添加一些功能...

  • 检查第一个图像或第一个 youtube 嵌入的帖子
  • 如果它首先找到图像然后返回它
  • 如果它首先找到嵌入的 youtube,则返回屏幕截图

我在网上找到了几个类似的例子,但没有任何符合要求的例子,这是我目前使用的......

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];

  if(empty($first_img)){ //Defines a default image
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

这可以正常工作并正确返回帖子的第一张图片,我现在正在努力添加 youtube 功能,我在网上找到了以下代码片段,但我不知道如何将它添加到上面的函数中..

preg_match( '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#', $markup, $matches );
    }

    // If we've found a YouTube video ID, create the thumbnail URL
    if ( isset( $matches[1] ) ) {
        $youtube_thumbnail = 'http://img.youtube.com/vi/' . $matches[1] . '/0.jpg';
    }

如果帖子中有两者,则在图像上选择 youtube 视频拇指的逻辑可以稍后出现,现在我只有带有图像或嵌入 youtube 的帖子。任何人都可以帮助将两者结合起来吗?


*编辑*

在使用 hakres 优秀的例子和答案后,我正在使用这个......

function catch_image($content, $defaultImage = '/images/default.jpg')
{
    $image = $defaultImage;
    $found = strlen($content);
    foreach (array(
                 'image'   => array(
                     'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
                     'mask'  => '%s'
                 ),
                 'youtube' => array(
                     'regex' => '#(?:https?(?:a|vh?)?://)?(?:www\.)?    youtube(?:\-nocookie)?\.com/watch\?.*v=([A-Za-z0-9\-_]+)#',
                     'mask'  => 'http://img.youtube.com/vi/%s/2.jpg'
                 ),
             ) as $search)
    {
        extract($search);
        if (preg_match($regex, $content, $matches, PREG_OFFSET_CAPTURE)
            && $matches[1][1] < $found
        ) {
            list($image, $found) = $matches[1];
            $image = sprintf($mask, $image);
        }
    }
    return $image;
}

我稍微修改了 youtube 正则表达式语句以及显示图像的掩码,一切正常。

但是我现在也需要尝试添加这些......

'regex' => '#<object[^>]+>.+?https?://www\.youtube(?:\-nocookie)?\.com/[ve]/([A-Za-z0-9\-_]+).+?</object>#s',
'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/[ve]/([A-Za-z0-9\-_]+)#',
'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
'regex' => '#(?:https?(?:a|vh?)?://)?(?:www\.)?youtube(?:\-nocookie)?\.com/watch\?.*v=([A-Za-z0-9\-_]+)#',
'regex' => '#(?:https?(?:a|vh?)?://)?youtu\.be/([A-Za-z0-9\-_]+)#',

然后,这将涵盖嵌入 youtube 视频的所有不同方式

4

2 回答 2

2

好的,这里有一些提示可以解决您的问题:

  1. 您进行了多项测试,一个用于第一张图像,一个用于 youtube 视频。
  2. 两种测试都可以成功或不成功。
  3. 首先出现的一个测试(在位置上)应该获胜。

您所做的两个测试都基于正则表达式。你寻找一个模式,如果匹配,你挑出一个匹配。对于图像,图像 src,对于 youtube 视频,则需要将视频 ID 放入字符串中。因此,您进行匹配,如果正确,则选择一个匹配并将其集成到一个模式中。所以实际上两者都是一样的,只是图案和面具不同。例子:

array(
     'image'   => array(
         'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
         'mask'  => '%s'
     ),
     'youtube' => array(
         'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
         'mask'  => 'http://img.youtube.com/vi/%s0.jpg'
     ),
 );

因此,如果您将查找结果初始化为字符串末尾的默认图像,然后查找任何进一步的搜索并检查它们是否与它们匹配的位置匹配。如果他们在最后一场比赛之前匹配,他们获胜并且比赛将被更新:

/**
 * Representa! - Pimp ur posts media
 *
 * @author   hakre <http://hakre.wordpress.com>
 *
 * @param string $content
 * @param string $defaultImage (optional)
 *
 * @return string
 */
function representa_image($content, $defaultImage = '/images/default.jpg')
{
    $image = $defaultImage;
    $found = strlen($content);
    foreach (array(
                 'image'   => array(
                     'regex' => '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
                     'mask'  => '%s'
                 ),
                 'youtube' => array(
                     'regex' => '#https?://www\.youtube(?:\-nocookie)?\.com/embed/([A-Za-z0-9\-_]+)#',
                     'mask'  => 'http://img.youtube.com/vi/%s0.jpg'
                 ),
             ) as $search)
    {
        extract($search);
        if (preg_match($regex, $content, $matches, PREG_OFFSET_CAPTURE)
            && $matches[1][1] < $found
        ) {
            list($image, $found) = $matches[1];
            $image = sprintf($mask, $image);
        }
    }
    return $image;
}

用法:

$url = representa_image($post->post_content);

我希望这可以简化您的问题,并让您了解如何解决此类问题。请注意,我正在使用preg_matchPREG_OFFSET_CAPTURE标志将返回与每个匹配项匹配的位置。

于 2012-04-17T16:37:13.830 回答
1

好的,我为 filmyboss.com 实现此代码,它可以搜索该关键字的视频是否已经在数据库中,然后显示搜索结果,否则它会在 youtube 中使用该关键字搜索并更新它我认为您可以根据需要轻松调试它

 global $query_string;

                        if(have_posts()):
    //You already have it 
    else:
    $x = json_decode(file_get_contents("http://gdata.youtube.com/feeds/api/videos?q=some&format=5&max-results=1&v=2&duration=long&alt=jsonc"));
                        $y = $x->data;
                        $z = $y->items;
                        $d['_my_meta']['ytkey'] = $z['0']->id;
                        $t = $z['0']->title;
                        $post = array(
                        'post_status' => 'publish', 
                        'post_title' => $t, //The title of your post.
                        'post_type' => 'post');
                        echo $d; 
                        $key = "_my_meta";
                        $post_id = wp_insert_post( $post );
    endif;
于 2012-04-17T13:24:30.583 回答