2011-09-20 30 views
22

我试图从每个帖子中获取第一张图片。如果我只有一个图像,下面的代码很好用。但如果我有更多的话,它会给我一个形象,但并不总是第一个。使用php获取字符串中的第一个图像

我真的只想要第一张图片。很多时候,第二图像是下一个按钮

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 

preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $texthtml, $matches); 
$first_img = $matches [1] [0]; 

现在我可以把这个“$ first_img”,并把它贴在简短描述的前

<img alt="Sara" title="Sara" src="<?php echo $first_img;?>"/> 

回答

38

如果你只需要第一个源代码,preg_match应该做的,而不是preg_match_all,这是否对你的工作?

<?php 
    $texthtml = 'Who is Sara Bareilles on Sing Off<br> 
    <img alt="Sara" title="Sara" src="475993565.jpg"/><br> 
    <img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
    preg_match('/<img.+src=[\'"](?P<src>.+?)[\'"].*>/i', $texthtml, $image); 
    echo $image['src']; 
?> 
+1

奇怪的是,我用你的代码替换它,我仍然得到第二个图像 – MHowey

+0

你可以在这里粘贴使它失败的HTML,因为Kelsey说你的代码也应该工作,所以如果我们有一个例如失败。 – derp

+12

不是你的代码太贪婪?所以如果alt标签出现在src之后,它也会捕获它。你需要'+?'而不是'+'。所以你有:'preg_match('/ 。+?)[\'']。*>/i',$ texthtml,$ image);' –

1

确定的正则表达式是永远匹配第一个?尝试在每次调用它,看一次打印数组:

error_log(var_export($matches, true));

+0

那是我的问题。它总是返回一个图像,但我需要它返回第一个图像 – MHowey

+0

那么你的代码看起来应该工作(虽然我没有检查正则表达式)。您正在访问第二个数组,其中包含捕获的模式,然后是该数组中的第一个元素,即第一个图像。你有没有尝试打印整个数组,并确保当你看到错误的图像时,第一个图像也匹配?我敢打赌它没有。 –

5

不要使用正则表达式来解析html。 使用HTML的解析的lib /类,phpquery:

require 'phpQuery-onefile.php'; 

$texthtml = 'Who is Sara Bareilles on Sing Off<br> 
<img alt="Sarahehe" title="Saraxd" src="475993565.jpg"/><br> 
<img alt="Sara" title="Sara two" src="475993434343434.jpg"/><br>'; 
$pq = phpQuery::newDocumentHTML($texthtml); 
$img = $pq->find('img:first'); 
$src = $img->attr('src'); 
echo "<img alt='foo' title='baa' src='{$src}'>"; 

下载:http://code.google.com/p/phpquery/

+1

谢谢,但我想要的最后一件事是添加大量的代码修复一个小图片问题。preg_match对于从sql调用的几行html很好。但是,感谢您花时间回复 – MHowey

+1

是的,也许是很多代码,但在性能问题上,与正则表达式相比,phpQuery速度更快。 –

+0

我会同意在大多数情况下。但是这是一个小博客,每页5个图像。我会记住你的建议。我真的非常感谢你/ – MHowey

2

从这里Using regular expressions to extract the first image source from html codes?测试的答案后,我得到了更好的用更少的无效链接的图像比这里提供的答案结果。

虽然正则表达式可以适用于各种各样的任务,但我发现它在解析HTML DOM时通常很短。 HTML的问题在于,您的文档结构变化太大,以至于很难准确(并且准确地说,我的意思是100%的成功率,并且没有误报)提取标签。

要获得更一致的结果,请使用此对象http://simplehtmldom.sourceforge.net/,它允许您操作html。 在我发布的第一个链接的回复中提供了一个示例。

function get_first_image($html){ 
require_once('SimpleHTML.class.php') 

$post_html = str_get_html($html); 

$first_img = $post_html->find('img', 0); 

if($first_img !== null) { 
    return $first_img->src'; 
} 

return null; 
} 

享受

相关问题