【问题标题】:Find and Replace image src with the matching object value使用匹配的对象值查找和替换图像 src
【发布时间】:2019-03-05 20:54:33
【问题描述】:

我正在尝试将所有 src 值替换为匹配的键值,文本如下所示:

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br /><br />
lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem <img src="71521" alt="[ppm:alt id=17835]" height="426" width="638" /> ipsumlorem ipsumlorem ipsum

我的对象如下:

    var mapObj = {
        '71505':'https://images.e12b64dd10dd068f0b4b6e8e9e5e/71505.jpg',
        '69451':'https://imagesf697987a167a07402549e86089d/69451.jpg',
        '71521':'https://images673d2cf1bfcb6fcc1d30f91/71521.jpg',
        ...
    }

我想检查 src 值是否与对象键匹配,如果匹配则将所有匹配项替换为键的相应值,我想要的输出是

Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br />
lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem

到目前为止,我有以下内容,但它不起作用

var res = row['Description'].replace(/\[(\w+)\]/g, function(s, key) {
   return mapObj[key] || s;
});

我尝试了下面回答的所有解决方案,但我仍然无法替换 src。

我的 html 源代码来自 excel 表,我正在这样阅读它

const rows = fs.createReadStream(csvFilePath,{encoding: `'binary'}).pipe(parser);`

【问题讨论】:

  • 非常直接的问题,但我没有看到尝试。
  • 为什么src="69451" 改为src="https://imagesf697987a167a07402549e86089d/69451.jpg" 而不是https://imagesf697987a167a07402549e86089d/71513.jpg
  • 我正在使用 nodejs,当我在终端中执行 console.log 时,它不会更改 src,我还使用 fs.writeFile 将结果保存在文本文件中,仍然如此不改变源代码
  • @nick zoum 感谢指出,现在更正了
  • @sam 您需要记录replace 的结果。如果你这样做var a = test.replace()。您应该打印a 而不是test。字符串是不可变的。

标签: javascript arrays node.js object


【解决方案1】:

使用forEach 遍历mapObjkeys。每次用键值替换key。你说文本看起来像这样”所以我认为你要求的是字符串

let text = `Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br />
<img src="69451" alt="[ppm:alt id=17835]" height="426" width="638" /><br />
lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem <img src="71521" alt="[ppm:alt id=17835]" height="426" width="638" /> ipsumlorem ipsumlorem ipsum`


var mapObj = {
        '71505':'https://images.e12b64dd10dd068f0b4b6e8e9e5e/71505.jpg',
        '69451':'https://imagesf697987a167a07402549e86089d/71513.jpg',
        '71521':'https://images673d2cf1bfcb6fcc1d30f91/71521.jpg',
    }
Object.keys(mapObj).forEach(key => {
  text = text.replace(`src="${key}"`,`src="${mapObj[key]}"`);
})
console.log(text);

【讨论】:

  • 它不会替换 src :(
  • @sam 它工作正常。请检查sn-p。我认为它符合您的预期输出。
  • 我正在使用 nodejs,当我在终端中执行 console.log 时,它不会更改 src,我还使用 fs.writeFile 将结果保存在文本文件中,仍然如此不改变源代码
  • @sam 你会在别处犯错,因为代码在 sn-p 中运行良好
  • @MaheerAli 老实说,如果 src 使用 ' 而不是 " 包装,您的解决方案可能无法工作。但事实并非如此,因为我的也不起作用。虽然答案足够好,值得一票
【解决方案2】:

只需遍历mapObj的所有属性,然后你可以通过document.querySelector("[src='71505']")找到任何src等于键的元素,然后修复src

var mapObj = {
  '71505': 'https://images.e12b64dd10dd068f0b4b6e8e9e5e/71505.jpg',
  '69451': 'https://imagesf697987a167a07402549e86089d/71513.jpg',
  '71521': 'https://images673d2cf1bfcb6fcc1d30f91/71521.jpg'
};

for (var key in mapObj) {
  document.querySelectorAll(`[src='${key}']`).forEach(item => item.src = mapObj[key]);
}
console.log(document.body.innerHTML);
Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br />
<img src="69451" alt="[ppm:alt id=17835]" height="426" width="638" /><br /> lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem <img src="71521" alt="[ppm:alt id=17835]" height="426" width="638" /> ipsumlorem ipsumlorem ipsum

如果 HTML 是字符串形式并且您不想将其解析为 HTML,那么您应该将所有出现的 src="${key}" 和 src='${key}' 替换为来自 mapObj 的相应值。像这样:

var mapObj = {
  '71505': 'https://images.e12b64dd10dd068f0b4b6e8e9e5e/71505.jpg',
  '69451': 'https://imagesf697987a167a07402549e86089d/71513.jpg',
  '71521': 'https://images673d2cf1bfcb6fcc1d30f91/71521.jpg'
};

var fullText = `Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br />
<img src="69451" alt="[ppm:alt id=17835]" height="426" width="638" /><br /> lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem <img src="71521" alt="[ppm:alt id=17835]" height="426" width="638" /> ipsumlorem ipsumlorem ipsum`;

function changeText(text) {
  for (var key in mapObj) {
    text = text.replace(new RegExp(`src="${key}"`, "gi"), `src="${mapObj[key]}"`)
      .replace(new RegExp(`src='${key}'`, "gi"), `src='${mapObj[key]}'`);
  }
  return text;
}

console.log(changeText(fullText));

【讨论】:

  • 我想用一个字符串变量来保存html数据,那么如何替换document.querySelectorAll呢?例如:var html = objectData
  • 我添加到答案中的第二个示例对您有用吗?
  • @sam 您是否还想将mapObj 中不存在的src 替换为默认值?因为这是src 不会改变的唯一情况
【解决方案3】:

您可以将文本包装在容器中,然后使用 querySelectorAll 来获取所有 img。然后迭代该节点列表并将值替换为对象的相应结果

var mapObj = {
  '71505': 'https://images.e12b64dd10dd068f0b4b6e8e9e5e/71505.jpg',
  '69451': 'https://imagesf697987a167a07402549e86089d/71513.jpg',
  '71521': 'https://images673d2cf1bfcb6fcc1d30f91/71521.jpg'
}

let txt = document.getElementById('content').querySelectorAll('img').forEach(function(item) {
  let srcVal = item.getAttribute('src');
  item.setAttribute('src', mapObj[srcVal])
});
<div id='content'>
  Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum <br/>
  <img src="69451" alt="[ppm:alt id=17835]" height="426" width="638" /><br/> lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem <img src="71521" alt="[ppm:alt id=17835]" height="426" width="638" /> ipsumlorem ipsumlorem ipsum my object goes like the following:
</div>

【讨论】:

  • You can wrap the text in a container 说起来容易,做起来难
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2018-09-29
  • 2020-09-29
  • 2014-12-21
  • 2013-10-08
  • 1970-01-01
  • 2011-05-03
  • 2013-10-16
相关资源
最近更新 更多