Regex 正则表达式代码异常

Regex 正则表达式代码异常,regex,html-parsing,Regex,Html Parsing,我有以下函数返回帖子的第一个图像: $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches); $output=preg\u match\u all(“//i”, $post->post_内容,$matches); 但是,如果返回任何图像,我需要忽略gif格式的图像,如何在regex表达式中添加此条件?]*> &

我有以下函数返回帖子的第一个图像:

$output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', 
               $post->post_content, $matches);
$output=preg\u match\u all(“//i”,
$post->post_内容,$matches);
但是,如果返回任何图像,我需要忽略gif格式的图像,如何在regex表达式中添加此条件?

]*>
<img[^>]+src=[\'"](?:([^\'"](?!\.gif))+)[\'"][^>]*>
更新为只有一个捕获

固定为包括圆点。现在只会在像a.gif.jpg这样的奇怪事情上失败


还添加了注释中建议的安全匹配。

更容易循环查看结果并使用不同的正则表达式

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

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

  • HTML是不规则的
  • 正则表达式今天可能匹配,但明天呢
假设您有一个HTML文件,试图从标记中提取URL

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

因此,您可以编写这样的正则表达式(在Perl中):

if($html=~/
在这种情况下,$url确实包含。但是当您开始像这样获取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/outdated.png"> -->


您无法使用regex解析[X]HTML,因为!@Oriol“解析HTML”和获取属性内容之间存在差异。使用regex,失败点是如果注释中包含图像标记(可以接受),但另一方面,如果HTML无效,则正确的解析解决方案将失败,因此“适当的解决办法"也是不完美的。不能用正则表达式解析任意HTML,但对于已知格式的简单操作,正则表达式是非常可行的。PS:投票否决了一个新用户的第一个问题,他清楚地解释了他的问题并试图解决它???@Sylverdrag是的,但asker没有说HTML字符串是可信的,并且始终具有相同的格式,所以我只回答了一个问题我想警告一下。而否决票不是我的。@Oriol提问者没有这样说,但他正在检查$post->post_内容的结果。我认为可以安全地假设源HTML是他的Wordpress页面的HTML内容。对于否决票,对不起,我怀疑不是你,但我太懒了,没有在单独的com中写下这一观察结果img和src之间的匹配可能会产生意外的结果,正如。*:::(?!gif))+)[\'“].*?>我已经适当地更新了我的代码+1,因为我没有尝试将所有内容都放在一个正则表达式中。
<img border=0 src="http://example.com/whatever.jpg">
<img
    src="http://example.com/whatever.jpg">
<!-- <img src="http://example.com/outdated.png"> -->