【问题标题】:How to add HTML tags around variating expression with JS如何使用 JS 在变量表达式周围添加 HTML 标签
【发布时间】:2020-10-18 16:06:14
【问题描述】:

我想在标记 [x,y] 周围添加 HTML 标记,其中 x 和 y 的变化可能会有所不同。我尝试使用一些正则表达式来获取这些文本,但我没有得到想要的结果。

我用这个命题:Insert HTML into text node with JavaScript

在我的页面中,有

[x,y] 标记 x 和 y 是介于 -99 和 99 之间的数字

此标记是在文本编辑器中手动编写的,是与视频游戏相关的文章内容的一部分,同一页面中可能有多个标记。

所以我需要全部替换

 [x,y] to <em class="position">[x,y]</em>

我试试这些正则表达式:

\[(.*?)\] (but add only <em> on . in the page)
\[0-9+\] (but add one <em> for each number in [x,y])

目的是允许用户单击这些元素将其复制到剪贴板。 (这第二部分工作正常)

有人可以帮助我吗? :)

【问题讨论】:

  • 1) 标记总是在变化/变化吗? 2) 是唯一持续可靠的模式确实就是这样...&lt;element ... &gt;&lt;/element&gt;? 3)如果标记确实不同,您能否提供更多标记示例代码......也许一些标记确实彼此不同?
  • 在对这个问题投赞成票之前。也许应该考虑一下这个问题是否以一种真正理解 OP 基本问题的方式提出。到目前为止提供的内容留给猜测的空间比提出可靠方法的空间更大。
  • 嗨,标记是 [x,y],其中 x 和 y 可以是正数或负数,例如 [-10,77] 或 [24,87] ,从技术上讲,x 和 y 可以取值介于 -99 和 99 之间
  • 您是否正在寻找任何答案?如果不是,请澄清。一些常见情况的结果应该是什么。
  • @SalakissODV ...这不是答案。它只是重复了 Q 中已经提供的信息。请编辑您的 Q。以了解输入数据或需要处理的数据的方式。就像已经有标记一样,它来自哪里。如果例如你的text 看起来像这样...[10,24] or [14,-25] or [x,y] ..,替换会是3 次&lt;em class="position"&gt;[x,y]&lt;/em&gt;

标签: javascript html


【解决方案1】:

您可以使用.match() 函数从字符串中提取[x,y] 组合,然后将这些匹配的组合替换为&lt;em&gt; 标记

非重复坐标

如果文本中没有重复的坐标,则使用以下方法

const p = document.querySelector('p');
let str = p.textContent;
const regex = /(\[-?\d{1,2},-?\d{1,2}\])+/g;
const matches = str.match(regex);

matches.forEach(m => (str = str.replace(m, `<em class="position">${m}</em>`)));
p.innerHTML = str;
.position {
  color: blue;
}
&lt;p&gt;[10,24] or [14,-25] or [-100,-210] or [-99,99]&lt;/p&gt;

重复坐标

如果有重复坐标,则使用以下方法

const p = document.querySelector('p');
let str = p.textContent;
const regex = /(\[-?\d{1,2},-?\d{1,2}\])+/g;
const matches = str.match(regex);

matches.forEach((m, i) => {
  str = str.split(m).join(`<em class="position">${m}</em>`);
});

p.innerHTML = str;
.position {
  color: blue;
}
&lt;p&gt;[10,24] or [10,24] or [14,-25] or [14,-25] or [-100,-210] or [-99,99]&lt;/p&gt;

【讨论】:

  • 注意:这不适用于[10,24] or [10,24]。不过,-9999 的要求做得很好
  • 基于match 的方法容易出现任何坐标重复错误。在迭代matches 列表时,任何重复项将在str 第一次出现时被一次又一次地替换;因此,确实为第一个出现的坐标创建了嵌套标记,并错过了str 中尚未被替换且永远不会被替换的那些。
  • @SalakissODV ...到目前为止,Yousaf 的正则表达式和 blex 的方法的组合就可以满足 OP 的要求。跨度>
  • 答案已编辑。添加了另一种方法来处理具有重复坐标的字符串
【解决方案2】:

您可以使用.replace(),并传递一个正则表达式。关于我使用的正则表达式的更多解释:

(Courtesy of Regex101.com)

演示:

var p = document.querySelector('p');

p.innerHTML = p.innerText.replace(/(\[-?\d+,-?\d+\])/g, '<em class="position">$1</em>');
.position { font-weight: bold; color: red; }
&lt;p&gt;[10,24] or [14,-25] or [x,y] (← these are not valid numbers)&lt;/p&gt;

【讨论】:

  • replace(/(\[[^\]]+\])/g, '&lt;em class="position"&gt;$1&lt;/em&gt;');
  • @MoshFeu 哦,不错!谢谢
  • @blex ...您的正则表达式匹配超出了理想的用例,例如每个括号对[,], [ ], [x,], [x,y,z]。这可能足够可靠。 OP 的 Q 提到 ... “标记是 [x,y],x 和 y 是 -99 到 99 之间的数字。” ...不过。
  • @PeterSeliger 你是对的。我回答后,OP提到了这一点。我会编辑答案
猜你喜欢
  • 2017-04-02
  • 2020-08-06
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多