正则表达式代码异常gif

时间:2013-10-09 02:12:24

标签: regex html-parsing

我有以下函数返回帖子的第一张图片:

$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', 
               $post->post_content, $matches);
然而

返回任何图像,我需要忽略gif格式的图像,我怎么能在正则表达式中添加这个条件?

3 个答案:

答案 0 :(得分:1)

更容易遍历结果并使用不同的正则表达式。

  $output = preg_match_all('/<img[^>]+?src=[\'"](.+?)[\'"].*?>/i', $post->post_content, $matches);
foreach ($matches as $imgSrc)
{
    if (!preg_match("/\.gif$/i"), $imgSrc)
    {
        $noGif[] = $imgSrc;
    }
}

它更容易理解,并且不会出现意外的副作用,例如阻止碰巧在文件名中包含字母“gif”的有效图片。

注意,使用.+.*时要非常小心。就目前而言,你的正则表达式比你想象的要多得多:

试试这个,例如:

<img whatever> whatever <img src="mypic.png"> <some other tag>

答案 1 :(得分:1)

您可能不应该使用正则表达式

  • HTML不常规
  • 正则表达今天可能会匹配,但明天呢?

假设您有一个HTML文件,您尝试从标记中提取网址。

<img src="http://example.com/whatever.jpg">

所以你写这样的正则表达式(在Perl中):

if ( $html =~ /<img src="(.+)"/ ) {
    $url = $1;
}

在这种情况下,$ url确实包含http://example.com/whatever.jpg。但是当你开始像这样开始获取HTML时会发生什么:

<img src='http://example.com/whatever.jpg'>

<img src=http://example.com/whatever.jpg>

<img border=0 src="http://example.com/whatever.jpg">

<img
    src="http://example.com/whatever.jpg">

或者你开始从

获得误报
<!-- <img src="http://example.com/outdated.png"> -->

答案 2 :(得分:0)

<img[^>]+src=[\'"](?:([^\'"](?!\.gif))+)[\'"][^>]*>

更新为只有一次捕获。

修复了包含点的问题。现在只会失败,比如a.gif.jpg

还添加了评论中建议的安全匹配。