【问题标题】:Regex while-loop only pushes 1 value to my array正则表达式 while-loop 仅将 1 个值推送到我的数组
【发布时间】:2017-05-17 13:05:30
【问题描述】:

我的变量htmlContent 包含一个字符串,其内容采用格式正确的 HTML 代码,它包含多个 img 标记。

我正在尝试获取图像src 属性的所有值并将它们放入数组srcList

但是,我在使用以下代码时遇到的问题是,它总是提醒一个只有 1 个源值的数组,而我将它设置为将 all 源 URL 推送到数组,而不仅仅是一个。

let srcList = [],
    imgSrc,
    regex = /<img.*src="(.*?)"/gi;

while ((imgSrc = regex.exec(htmlContent)) !== null) {
    srcList.push(imgSrc[1]);
}

alert(JSON.stringify(srcList));

我怎样才能按照我的预期进行这项工作?

【问题讨论】:

  • 你用过str.match(regexp)吗?它将返回一个包含整个匹配结果和任何括号捕获的匹配结果的数组;如果没有匹配项,则为 null。

标签: javascript regex typescript


【解决方案1】:

您的正则表达式中imgsrc 之间的.* 贪婪地匹配从第一个img 到最后一个src 的所有内容——否则您的代码基本上是正确的,但只会捕获最后一个图像出于这个原因的来源。

将贪心匹配替换为仅在每个 &lt;img&gt; 标记内匹配的内容的示例(如果如 cmets 中所述,html 字符串是单行):

let srcList = [],
  imgSrc,
  regex = /<img[^>]*src="(.*?)"/gi;

let htmlContent = '<img src="foo"><img class="bat" src="bar"><img src="baz">';


while (imgSrc = regex.exec(htmlContent)) {
  srcList.push(imgSrc[1]);
}

console.log(srcList);

(我觉得有必要在此处插入强制性的“don't try to parse HTML with regular expressions”警告。请考虑使用类似$('img').each(function() {srcList.push($(this).attr('src'))} 的内容。)

【讨论】:

  • 仅当文档源代码在整行内时才正确。
  • 确实如此。更有理由在解析 html 时不使用正则表达式。
  • 这里使用正则表达式没有问题。所有这些元素和属性,我不称之为 HTML 解析。
  • 嗯,它是 HTML,我们正在解析它,所以...¯\_(ツ)_/¯ YMMV 但几乎每次我都在想“哦,这是只是一个简单的匹配,我可以使用正则表达式”我已经后悔了。对于一次性的一次性代码,当然可以;对于我必须维护的任何事情,通常最好一开始就以正确的方式进行。
  • 你看到的是 HTML,我看到的是原始文本。正则表达式不再那么规则,作为一个强大的文本处理工具,在这种情况下,如果你知道你要做什么,确实不会有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2021-10-06
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多