javascript - 尽管/g,.replace() 不会替换每个实例

标签 javascript html replace

所以,我的 javascript 代码有两个问题。我会尽力使其尽可能短,并且仅复制问题所需的部分。

我有这个 html 代码(每个 li 看起来都不一样不是我的错):

    <li>
        <span style="font-family:arial, helvetica, sans-serif;">Siehe <a href="Link 1" rel="">Text 1</a>.</span>
    </li>
    <li>
        <span style="font-family:arial, helvetica, sans-serif;">Siehe</span> <a href="Link 1" rel="">Text 2</a>.<span style="font-family:arial, helvetica, sans-serif;"> </span>
    </li>
    <li>
        Siehe <a href="Link 1" rel="">Text 3</a>.
    </li>

这里是解决我的问题所需的 javascript 代码。首先,我删除每个 span 元素。之后我想替换“a href”部分并增加新字符串的数量。

var neu = document.getElementById("ausgabe").value;             
var nummer = 0;
function getNextDlcNumber() {
    return ++nummer;
}

var ersetzen = neu
.replace(/<span.*?>(.*?)<\/span>/g, "$1") // Gets rid of every span
.replace(/\s<li>\n\s\sSiehe\s*<a href=".*?" rel="">(.*?)<\/a>\.\n\s<\/li>/g, "\t<li>\n\t\tSiehe <a class=\"trophiesAnkerLink\" href=\"#dlc" + getNextDlcNumber() + "\" rel=\"\">$1</a>.\n\t</li>")); // Replaces a href with increasing dlc numbers

document.getElementById("ausgabe").value = ersetzen;

这有两个问题:

  1. 第一个和第三个“a href”已成功替换。但第二个不是,我不明白为什么。我认为这与“Siehe”和“a”标签开头之间的跨度标签有关,但是由于第一次替换,跨度应该被删除,所以我不确定这是否是导致问题的原因。我尝试使用“Siehe\s*或其中包含“</span> ”,但这些都不起作用。

  2. “#dlc”之后的数字没有增加,即使是第三个也只是停留在“#dlc1”。我需要以不同的方式做到这一点吗?

这是使用js后的输出:

    <li>
        Siehe <a class="trophiesAnkerLink" href="#dlc1" rel="">Text 1</a>.
    </li>
    <li>
        Siehe <a href="Link 1" rel="">Text 2</a>. 
    </li>
    <li>
        Siehe <a class="trophiesAnkerLink" href="#dlc1" rel="">Text 3</a>.
    </li>

我希望我发布了所有必要的信息。如果没有,我可以提供更多。提前感谢您的帮助:)

最佳答案

实际上,手动解析和编辑 DOM 元素内容是一个非常糟糕的主意,您不必让生活变得复杂并重新发明轮子。

您可以使用JS内置方法直接访问链接元素的.href属性并直接更改它,甚至无需使用.replace() 方法。

这就是您的代码:

let elements = Array.from(document.getElementById("ausgabe").querySelectorAll("a"))
elements.forEach(a => a.href = "#dlc" + getNextDlcNumber());

您可以看到它可以只是一个单行代码,即可完成您想要实现的所有目标。

演示:

var nummer = 0;

function getNextDlcNumber() {
  return ++nummer;
}

Array.from(document.getElementById("ausgabe").querySelectorAll("a")).forEach(a => a.href = "#dlc" + getNextDlcNumber());
<div id="ausgabe">
  <li>
    <span style="font-family:arial, helvetica, sans-serif;">Siehe <a href="Link 1" rel="">Text 1</a>.</span>
  </li>
  <li>
    <span style="font-family:arial, helvetica, sans-serif;">Siehe</span> <a href="Link 1" rel="">Text 2</a>.<span style="font-family:arial, helvetica, sans-serif;"> </span>
  </li>
  <li>
    Siehe <a href="Link 1" rel="">Text 3</a>.
  </li>

</div>

您可以通过将鼠标悬停在链接上来检查它们的新值,等等。

关于javascript - 尽管/g,.replace() 不会替换每个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75684230/

相关文章:

javascript - 在第一个元素中添加 Highcharts 标签

javascript - 正则表达式单词边界

javascript - jQuery 在 div 鼠标悬停时更改输入值

html - 两人如何在 Azure 上为同一域设置三个应用服务

sql-server - 替换sql server 2000中的ntext(超过4000个字符)

javascript - 日期在 Highcharts 面积图中重叠

javascript - 是否可以组合两个 FileList 对象?

PHP + 超薄 PHP 框架 : How to dynamically add stylesheets to the document head?

python - 创建模式来检测序列的出现,以便您可以限制在哪些情况下替换输入字符串中检测到的子字符串

javascript - 使用JavaScript更改CSS中单词的所有出现