我正在尝试向执行以下操作的wordpress网站添加一些功能......
我在网上找到了几个相似的例子,但没有任何符合条件的内容,这是我到目前为止使用的内容......
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视频可嵌入的所有不同方式
答案 0 :(得分:2)
好的,这里有一些解决问题的方法:
您所做的两项测试均基于正则表达式。你寻找一个模式,如果匹配,你挑选一个匹配。对于图像,图像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_match
和PREG_OFFSET_CAPTURE
标记,该标记将返回与每个匹配项匹配的位置。
答案 1 :(得分:1)
好吧我为filmyboss.com实现了这个代码,可以搜索该关键字的视频是否已经在db中然后显示搜索结果,否则它会在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;