【问题标题】:Getting the first image in string with php用php获取字符串中的第一张图片
【发布时间】:2011-11-20 17:52:46
【问题描述】:

我正在尝试从我的每个帖子中获取第一张图片。如果我只有一张图片,下面的代码效果很好。但如果我有更多,它会给我一个形象,但并不总是第一个。

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

$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;?>"/>

【问题讨论】:

  • 你确定正则表达式总是匹配第一个吗?每次调用时尝试打印数组以查看:error_log(var_export($matches, true));
  • 那是我的问题。它总是返回一张图片,但我需要它只返回第一张图片
  • 你的代码看起来应该可以工作(虽然我没有检查正则表达式)。您正在访问第二个数组,其中包含捕获的模式,然后是该数组中的第一个元素,即第一个图像。您是否尝试将整个阵列打印出来并确保当您看到错误的图像时,第一张图像也匹配?我敢打赌没有。

标签: php image preg-match-all


【解决方案1】:

如果你只需要第一个源标签,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'];
?>

【讨论】:

  • 奇怪,我用你的代码替换了它,我仍然得到第二张图片
  • 您能否在此处粘贴导致它失败的 html,因为正如 Kelsey 所说,您的代码也应该可以工作,因此如果我们有一个失败的示例,则更容易跟踪错误。
  • 你的代码是不是太贪心了?因此,如果 alt 标签出现在 src 之后,它也会捕获它。你需要+? 而不是+。所以你有:preg_match('/&lt;img.+src=[\'"](?P&lt;src&gt;.+?)[\'"].*&gt;/i', $texthtml, $image);
  • 或者你可以使用preg_match_all('/&lt;img [^&gt;]*src=["|\']([^"|\']+)/i', $texthtml, $image);
【解决方案2】:

不要使用正则表达式来解析 html。 使用 html 解析库/类,作为 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/

【讨论】:

  • 谢谢,但我最不想做的就是添加大量代码来解决一个小图像问题。 preg_match 适用于从 sql 调用的几行 html。不过感谢您抽出宝贵时间回复
  • 是的,可能有很多代码,但在性能问题上,与正则表达式相比,phpQuery 要快得多。
  • 在大多数情况下我会同意。但这是针对每页呈现 5 张图像的小型博客而言的。我会记住你的建议。我真的很感谢你/
【解决方案3】:

在测试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;
}

享受

【讨论】:

  • SimpleHTMLDom 是最好的主意,如果你想从 HTML 中提取一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2019-12-29
  • 2016-05-18
相关资源
最近更新 更多