我有以下函数返回帖子的第一张图片:
$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
$post->post_content, $matches);
然而返回任何图像,我需要忽略gif格式的图像,我怎么能在正则表达式中添加这个条件?
答案 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文件,您尝试从标记中提取网址。
<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
还添加了评论中建议的安全匹配。