【问题标题】:Get number of times regex .replace() occurs获取正则表达式 .replace() 发生的次数
【发布时间】:2018-11-22 05:21:37
【问题描述】:

我正在构建一个 html linter,我要做的第一件事是删除所有 alt 属性。我正在使用正则表达式来替换 alt 标签。有没有办法删除数字替代代码。

如果你粘贴:

alt="23432" 一二三 alt='12312' 四五六 alt = "1124412"

你应该得到一二三四五六,我想将 3 存储到一个名为 numReplaced 的变量中。

function removeAlts(input) {
	var textIn = document.getElementById("textIn").value;
	var regex = /alt\s*=\s*[\"\'][a-zA-z0-9\s]*[\"\']/ig;
	var textOut = textIn.replace(regex, '');
	document.getElementById("textIn").value = textOut;
  //var numReplaced = ????
}
<button class="btn" onclick="removeAlts()">Remove Alts</button>
<div class="title">
	<h3>Paste code in box below and press button to remove alts!</h3>
</div>
<textarea name="input" id="textIn" cols="60" rows=15"></textarea>

【问题讨论】:

  • 你需要考虑像alt="it's okay"这样的情况

标签: javascript html regex


【解决方案1】:

一种选择是使用替换函数,并在每次调用时递增一个计数器。您还应该将您的正则表达式修复为 capture alt 属性中的初始双引号或单引号,以便稍后可以将其与反向引用匹配。使用这种反向引用策略,您还可以将alts 与其中的引号相匹配,因此将"' 添加到字符集中。

此外,您可以使用i 标志而不是重复[a-zA-Z,以及\d 而不是0-9。此外,引号不需要在正则表达式文字中进行转义。

function removeAlts(input) {
  var textIn = document.getElementById("textIn").value;
  var regex = /\s*alt\s*=\s*(["'])[a-z\d\s"']*?\1/ig;
  let counter = 0;
  var textOut = textIn.replace(regex, () => {
    counter++;
    return '';
  });
  document.getElementById("textIn").value = textOut;
  console.log(counter);
}
<button class="btn" onclick="removeAlts()">Remove Alts</button>
<div class="title">
  <h3>Paste code in box below and press button to remove alts!</h3>
</div>
<textarea name="input" id="textIn" cols="60" rows="15">
  <tag alt="foo"></tag>
  <tag alt="bar"></tag>
  <tag alt="that's okay"></tag>
</textarea>

但是使用DOMParser 搜索具有alt 属性的所有内容并删除它们会更优雅

function removeAlts(input) {
  var textIn = document.getElementById("textIn").value;
  const doc = new DOMParser().parseFromString(textIn, 'text/html');
  const alts = doc.querySelectorAll('[alt]');
  console.log(alts.length);
  alts.forEach(elm => elm.removeAttribute('alt'));
  document.getElementById("textIn").value = doc.body.innerHTML;
}
<button class="btn" onclick="removeAlts()">Remove Alts</button>
<div class="title">
  <h3>Paste code in box below and press button to remove alts!</h3>
</div>
<textarea name="input" id="textIn" cols="60" rows="15">
  <tag alt="foo"></tag>
  <tag alt="bar"></tag>
  <tag alt="that's okay"></tag>
</textarea>

【讨论】:

  • 你的正则表达式在alt="that's okay"这样的情况下将无法正常工作,因为它包含双引号和单引号
  • 是的,需要修复 OP 的正则表达式以捕获该字符并稍后反向引用它
  • 谢谢!我从来不知道 DOMParser :)
【解决方案2】:

您可以在模式的末尾使用相同的引号,如下所示:
/alt\s*=\s*(["']).+\1/ig

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2013-10-13
    相关资源
    最近更新 更多