Javascript 仅当不在<;标签>;及</标签>;

Javascript 仅当不在<;标签>;及</标签>;,javascript,regex,replace,Javascript,Regex,Replace,我们正在使用一个RegExp替换来搜索文本中的术语,并用包装点击。这就像一个符咒,直到我们有一个包含几个单词的术语,然后是一个只有其中一个单词的术语。例如: 以下是其中一种情况的示例,其术语为: “人性化设计系统”、“设计” 因此,我们的代码首先找到“人类设计系统”,用标记将其包装,然后在其中找到“设计”,并用标记将其包装 结果是: <dfn>Human <dfn>Design</dfn> System</dfn> 最终解决方案: var ESC

我们正在使用一个RegExp替换来搜索文本中的术语,并用
包装点击。这就像一个符咒,直到我们有一个包含几个单词的术语,然后是一个只有其中一个单词的术语。例如:

以下是其中一种情况的示例,其术语为:
“人性化设计系统”、“设计”

因此,我们的代码首先找到“人类设计系统”,用
标记将其包装,然后在其中找到“设计”,并用
标记将其包装

结果是:

<dfn>Human <dfn>Design</dfn> System</dfn>
最终解决方案:

var ESCAPERS = '[\\s!:\.\;,%\"\'\\(\\)\\{\\}]';
var terms = ['Design','Human Design System','This and That...'];
terms = terms.join('|');
re = new RegExp("(" + ESCAPERS + "|^)(" + terms + ")(" + ESCAPERS + "|$)",'gi');
nodes.contents().filter()
     .each(function(){
          $(this).replaceWith(this.nodeValue.replace(re, '$1<dfn class=\"thesaurus\">$2</dfn>$3'));
     });
var转义符='[\\s!:\.\;,%\'\'\\\'\(\\\)\{\\}';
var术语=[“设计”,“人类设计系统”,“这个和那个…”;
terms=terms.join(“|”);
re=newregexp(“(“+ESCAPERS+”|^)(“+terms+”(“+ESCAPERS+”|$)”,“gi”);
nodes.contents().filter()
.each(函数({
$(this.replaceWith)(this.nodeValue.replace(re,$1$2$3');
});

这些也是另一种方式,但单个正则表达式无法做到

查找此匹配设计
((?:(!))*)设计((?:(!))*)

将设计替换为
$1&tmp;$2

然后在匹配项中找到
设计
,并替换为
$&

现在,在
((?:(!))*)和tmp;((?:(!))*)中的dfn
内部进行匹配。

更改为
$1设计$2

现在问题解决了


如果您想在上面的代码中使用它。

我只需要匹配已经存在的标记并将它们传递给:

str=“人类设计系统人类设计设计人类测试者测试人类设计测试人类测试设计测试设计人类设计系统测试人类设计”;
str=str.replace(/(.+?)|(人类设计系统|设计)/g,功能(1,$2){
返回$1 | |“+$2+”;
});

警报(str)
一次完成即可:

var s='Human Design System Human Design Design Human Testar test'+
“人类设计测试人类测试设计测试设计人类”+
“设计系统测试人类设计”;
//按顺序尝试替代匹配。
var t=s.replace(/Human Design System | Design/g,'$&');

console.log(t);
感谢您的努力,但您真的了解我的问题吗?您要查找的是其中的任何内容,我们需要的是一个替换所有“术语”的替换查询“除非术语在范围内,请举例说明。您的输入和所需的输出是什么。输入和所需的结果addedI已编辑代码。这是你回答问题的另一种方式。我们有数百个术语需要替换,尽管你的建议可能有道理,我会调查这是否是一种更好的方法!谢谢你的第一个答案,经过一些改进后,我们得到了比我们使用的插件的代码更好更快的工作!
//Definition of variables, please not that ~open~ is replaced by <dfn> and ~close~ is replaced by </dfn> later  
var TPL_TAG_OPEN = '~open~',
    TPL_TAG_CLOSE = '~close~',
    ESCAPERS = '[\\s!:\.\;,%\"\'\\(\\)\\{\\}]';

//This is the RegExp that prepares the content
//term is the term that we are looking for and line is the text we are searching in

var re = new RegExp("^("+term+")(" + ESCAPERS + ")", modifier);
line = line.replace(re, TPL_TAG_OPEN + "$1" + TPL_TAG_CLOSE + "$2");

re = new RegExp("(" + ESCAPERS + ")("+term+")$", modifier);
line = line.replace(re, "$1" + TPL_TAG_OPEN + "$2" + TPL_TAG_CLOSE);

re = new RegExp("(" + ESCAPERS + ")("+term+")(" + ESCAPERS + ")", modifier);
line = line.replace(re, "$1" + TPL_TAG_OPEN +"$2" + TPL_TAG_CLOSE + "$3");
<dfn>Human Design System</dfn> Human Design Design Human Testar test Human Design Test 
Human Test Design Test Test Design <dfn>Human Design System</dfn> Test Human Design
<dfn>Human <dfn>Design</dfn> System</dfn> Human <dfn>Design</dfn <dfn>Design</dfn> 
Human Testar test Human <dfn>Design</dfn Test Human Test <dfn>Design</dfn> Test Test
<dfn>Design</dfn> <dfn>Human <dfn>Design</dfn> System</dfn> Test Human <dfn>Design</dfn>
<dfn>Human Design System</dfn> Human <dfn>Design</dfn> <dfn>Design</dfn> 
Human Testar test Human <dfn>Design</dfn> Test Human Test <dfn>Design</dfn> 
Test Test <dfn>Design</dfn> <dfn>Human Design System</dfn> Test Human <dfn>Design</dfn>
var pattern = RegExp("^("+TPL_TAG_OPEN+").*((?!"+TPL_TAG_CLOSE+").).*("+term+")*$");

if (pattern.test(line))
     return false;
var ESCAPERS = '[\\s!:\.\;,%\"\'\\(\\)\\{\\}]';
var terms = ['Design','Human Design System','This and That...'];
terms = terms.join('|');
re = new RegExp("(" + ESCAPERS + "|^)(" + terms + ")(" + ESCAPERS + "|$)",'gi');
nodes.contents().filter()
     .each(function(){
          $(this).replaceWith(this.nodeValue.replace(re, '$1<dfn class=\"thesaurus\">$2</dfn>$3'));
     });