【问题标题】:php preg_match to find <img> tag but not with gif extensionphp preg_match 查找 <img> 标签但不带有 gif 扩展名
【发布时间】:2013-02-18 08:50:06
【问题描述】:

我知道如何在字符串中查找 img 标签,但我需要排除任何带有 gif 扩展名的 img 标签。如何在我的 preg_match 中使用负数?我只需要第一个不包含 .gif 扩展名的图像标签。

我目前有这个:

  $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
  $pattern = "/<img[^>]+\>/i";
  preg_match($pattern, $text, $matches);
  $text = $matches[0];

$text 会给我第一个标签,例如&lt;img src="something.gif" border="0" /&gt; 但是,我不想接受 .gif,所以如果第一个是 gif,它会跳过它并继续搜索其他的。

请告诉我如何将我的代码更改为它。

非常感谢!

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    不要那样做。尝试使用正则表达式解析 HTML 是一项注定要失败的任务,因为 HTML 的复杂性或需求的轻微增加将使您的正则表达式复杂得难以置信。

    最好的方法是使用专为该任务设计的工具:DOMDocument 类。

    $dom = new DOMDocument;
    $dom->loadHTML($text);
    
    $images = $dom->getElementsByTagName('img');
    foreach ($images as $image) {
        if (!substr($image->getAttribute('src'), -4) === '.gif') {
            break;
        }
    }
    
    // $image is now the first image that didn't end with .gif
    

    【讨论】:

    • 感谢您的建议。谈到domdocument,我可以找出图像的宽度吗?假设我想排除 .gif 和宽度小于 200 像素的任何图像。我知道我可能可以做 getAttribute('width') 但人们可能没有宽度属性,或者实际尺寸可能更大。有没有办法找出图像的实际宽度?
    • @user2082532 并非没有使用图像库加载图像。
    【解决方案2】:

    如果您仍想使用正则表达式,请尝试将您的模式更改为类似的内容。

    <?php
    $text = '<img src="something.jpg" ';
    $pattern = '/<img\s+src="(([^"]+)(.)(jpeg|png|jpg))"/';
    preg_match_all($pattern, $text, $out);
    
    echo '<pre>';
    print_r($out);
    ?>
    

    【讨论】:

    • 那么&lt;img border="0" src="something.png" /&gt;呢?
    • 这也是有道理的:),我的模式只是为了表明扩展应该被列入白名单。
    【解决方案3】:

    试试这个:

    <?php
    $text = '<img src="something.jpg" ';
    
    preg_match('/src="(?P<image>.*\.(jpeg|png|jpg))"/', $text, $matches);
    
    echo $matches['image'];
    ?>
    

    【讨论】:

    • 您的正则表达式将匹配 .gif 扩展名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多