php - 使用正则表达式从 html 代码中提取第一个图像源?

标签 php html regex

我想知道这是如何实现的。

假设:有很多包含表格、div、图像等的 html 代码。

问题:如何获得所有匹配项。此外,具体来说,如何获取 img 标签源(src =?)。

例子:

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

如何打印出 http://example.com/g.jpg在这种情况下。我想假设我提到的 html 代码中还有其他标签,并且可能不止一张图片。是否可以在 html 代码中包含所有图像源的数组?

我知道这可以通过正则表达式来实现,但我无法掌握它。

非常感谢任何帮助。

最佳答案

虽然正则表达式适用于各种各样的任务,但我发现它在解析 HTML DOM 时通常不够用。 HTML 的问题在于您的文档的结构非常多变,因此很难准确(我所说的准确是指 100% 的成功率,没有误报)提取标签。

我建议您使用 DOM 解析器,例如 SimpleHTML 并这样使用它:

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;
}

有些人可能会认为这是矫枉过正,但最终,它会更容易维护,也允许更多的可扩展性。例如,使用 DOM 解析器,我还可以获得 alt 属性。

可以设计一个正则表达式来实现相同的目标,但会以强制 alt 的方式进行限制。属性在 src 之后反之亦然,克服此限制会增加正则表达式的复杂性。

此外,请考虑以下事项。正确匹配 <img>使用正则表达式标记并仅获取 src属性(在第 2 组中捕获),您需要以下正则表达式:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>

然后,如果出现以下情况,上述操作可能会失败:

  • 属性或标签名称大写, i 不使用修饰符。
  • 不在 src 周围使用引号属性。
  • 然后是另一个属性 src使用 >角色在他们的值(value)中的某个地方。
  • 一些我没有预见到的其他原因。

所以再说一次,不要使用正则表达式来解析 dom 文档。


编辑:如果您想要所有图片:

function get_images($html){
    require_once('SimpleHTML.class.php')

    $post_dom = str_get_dom($html);

    $img_tags = $post_dom->find('img');

    $images = array();

    foreach($img_tags as $image) {
        $images[] = $image->src;
    }

    return $images;
}

关于php - 使用正则表达式从 html 代码中提取第一个图像源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1196570/

相关文章:

PHP:获取指定输入的随机组合

php - 在插件中启动全局变量

javascript - 正则表达式:非连续的特殊字符只允许出现在中间

php - preg_match_all 用逗号分隔,值可能包含空格

php - Symfony 容器特性

php - 用于网络分析的数据集 API

javascript - TinyMCE:如何摆脱一些按钮

html - 固定布局上的边距间距损失

html - 输入类型提交值受到 css 转换属性的影响

regex - 使用正则表达式查找数字的第 n 次出现