【问题标题】:Extracting the property of an HTML element using RegEx使用 RegEx 提取 HTML 元素的属性
【发布时间】:2020-02-24 21:44:35
【问题描述】:

我正在处理一些图像延迟,并正在寻找一种删除 src 元素的方法。我有一个特定的用例,我需要使用正则表达式,以便我可以在服务器端呈现结果并停止加载 src,直到我在 JS 中告诉它。

基本上我需要一种方法来可靠地替换图像标签中的src。不是值,而是实际的属性名称。

截至目前,我正在测试以下内容:

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

给定我的示例文本,找到整个字符串<img src="aaaa" />。我基本上只需要它来突出显示src。这样我就可以对其进行 regex_replace 将src 更改为data-deferred

示例文本

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis bibendum lorem bibendum lectus rhoncus molestie. <img src ="aaaa" /> Maecenas ipsum justo, fermentum nec lacus in, porta consectetur metus.

这是我的 Regex101:https://regex101.com/r/RATGgw/1/

由于我并不总是可以访问要解析的 HTML,因此我不能只定位 src。我需要确保在图像标签中的任何位置找到它时只有src

知道如何修改它来完成这个吗?

编辑:

为了澄清,问题是,我如何使用 RegEx 才能在图像标签中仅找到 src 属性。

因此,我找到的结果将允许我将 src="https://" 替换为自定义数据属性,例如 data-deferred="https://"

【问题讨论】:

    标签: javascript regex web-scraping


    【解决方案1】:

    您可以通过在正则表达式中使用捕获组(括号)将src 属性替换为data-deferred 属性,如下所示:

    //           [    $1   ][$2 ][?= a lookahead (no capture)  ][global - replace all]
    var regex = /(<img[^>]+)(src)(?=\s*=\s*['"][^'"]+['"][^>]*>)/g;
    var text = 'Lorem ipsum. <img alt="foo" src ="aaaa" title="bar" /> Maecenas metus.';
    
    var result = text.replace(regex, '$1data-deferred'); 
    
    console.log(result);
    // Lorem ipsum. <img alt="foo" data-deferred ="aaaa" title="bar" /> Maecenas metus.

    【讨论】:

    • 我知道我的措辞可能令人困惑,但我无法仅匹配文本“src”。如,我想基本上把src="aaaa" 变成data-deferred="aaaa"。基本上将我的 src 属性替换为自定义数据属性。
    • 哦,好吧,对不起,我一开始没听懂。更新了我的答案,是这个意思吗?
    • 是的,基本上就是我要找的。只是出于好奇,正则表达式是否级联,因为它找到了完整的,然后分成组?有没有办法只找到 src 组?
    • 嗯,我发现一些 改进:结束部分没有捕获组,使用前瞻,并且不再使用回调函数进行替换。可能有一种方法可以删除第一个捕获组,但我找不到一个有效的方法。 This might be the answer 但它只是冻结了我的 Chrome
    • 哦,我添加了一个 g 标志(全局),以防你想替换多个匹配项
    【解决方案2】:

    你想用 jQuery 来做这样的事情:

    $('img[data-deferred]').each(function(i, img){
      $(img).attr('src', $(img).attr('data-deferred'))
    })
    

    【讨论】:

    • 考虑到我的限制,我正在尝试完成这个服务器端并且只能访问 Jinja2,但是它们的正则表达式替换选项有点缺乏。我希望 src 在渲染时被剥离,而不是在 dom 准备好之后。
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2015-03-15
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多