首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有在不在RegExp和</tag>的情况下才替换<tag>

只有在不在RegExp和</tag>的情况下才替换<tag>
EN

Stack Overflow用户
提问于 2014-11-14 10:51:52
回答 3查看 94关注 0票数 0

我们使用RegExp替换来搜索文本中的术语,并使用<dfn>包装点击。这就像一种魅力,直到我们有一个包含几个被包装的词的术语,然后一个只有其中一个词的词。例如:

以下是其中一种情况的例子,包括:

“人的设计系统”、“设计”。

因此,我们的代码首先找到“人工设计系统”,然后用一个<dfn>标记包装它,然后在其中找到“设计”,然后用一个<dfn>标记包装它。

其结果是:

代码语言:javascript
复制
<dfn>Human <dfn>Design</dfn> System</dfn>

当我们希望得到结果时:

代码语言:javascript
复制
<dfn>Human Design System</dfn>

因此,我们需要的是一种检查术语是否由<dfn></dfn>包装的方法,并简单地跳过这些情况的替换。

这是我们现在使用的代码:

代码语言:javascript
复制
//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");

输入:

代码语言:javascript
复制
<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

现在的结果:

代码语言:javascript
复制
<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>

通缉结果:

代码语言:javascript
复制
<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>

注意:

我们已经成功地检查了这个术语是否已经被标记包装过了,但只使用了RegExp .test函数,但是如果这样做会阻止文本继续下去并检查文本的其余部分,下面是代码:

代码语言:javascript
复制
var pattern = RegExp("^("+TPL_TAG_OPEN+").*((?!"+TPL_TAG_CLOSE+").).*("+term+")*$");

if (pattern.test(line))
     return false;

最后解决办法:

代码语言:javascript
复制
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'));
     });
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-14 15:44:21

只要一次就能做到:

代码语言:javascript
复制
var s = 'Human Design System Human Design Design Human Testar test ' +
        'Human Design Test Human Test Design Test Test Design Human ' +
        'Design System Test Human Design';

// Alternative matches are tried in sequence.
var t = s.replace(/Human Design System|Design/g, '<dfn>$&</dfn>');

console.log(t);

或者,递增地这样做:

代码语言:javascript
复制
var s = 'Human Design System Human Design Design Human Testar test ' +
        'Human Design Test Human Test Design Test Test Design Human ' +
        'Design System Test Human Design';

var adddfn = function(s, term){
    return s.replace(/(.*?)(<dfn>.*?<\/dfn>|$)/g, function(all, one, two){
        return one.replace(RegExp(term, 'g'), '<dfn>$&</dfn>') + two;
    });
};

var terms = ['Human Design System', 'Design'];

var t = terms.reduce(function(result, term){
    return adddfn(result, term);
}, s);

console.log(t);

票数 1
EN

Stack Overflow用户

发布于 2014-11-14 11:29:35

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

找到这个匹配设计(<dfn>(?:(?!</?dfn>).)* )design( (?:(?!</?dfn>).)*</dfn>)

$1&tmp;$2替代设计

然后找到匹配的Design并用<dfn>$&</dfn>替换

现在在dfn &tmp;中匹配(<dfn>(?:(?!</?dfn>).)* )&tmp;( (?:(?!</?dfn>).)*</dfn>)

更改为$1Design$2

现在问题解决了。

如果你想利用上面的代码。

票数 0
EN

Stack Overflow用户

发布于 2014-11-14 12:39:09

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

代码语言:javascript
复制
str = "<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";

str = str.replace(/(<dfn>.+?<\/dfn>)|(Human Design System|Design)/g, function(_, $1, $2) {
    return $1 || "<dfn>" + $2 + "</dfn>";
});

alert(str)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26928323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档