RegEx在匹配的单词周围放置标签

时间:2016-07-20 11:24:04

标签: javascript jquery html regex expression

我想在字符串中匹配的单词周围加上粗体标签。但是,我还需要能够在网址中找到匹配的单词。如果可能的话,我希望一切都有一个RegEx。

这是我到目前为止所尝试的内容:

我试过new RegExp("(^|\\s)(" + match.join('|') + ")(\\s|$)","ig")new RegExp('(\\b)(' + match2.join('|') + ')(\\b)','ig')

//keyword
var keyword = "Donec sed odio bacon dui.";
var match = ["donec", "bacon", "dui"]; //why does it ignore dui???

var reg1 = new RegExp("(^|\\s)(" + match.join('|') + ")(\\s|$)","ig");
//var reg1 = new RegExp('(\\b)(' + match.join('|') + ')(\\b)','ig');
var reg2 = "$1<b>$2</b>$3";

var keyword = keyword.replace(reg1, reg2);

console.log(keyword);

请帮助

2 个答案:

答案 0 :(得分:2)

问题在于重叠匹配。单词dui在它之后有一个句号(它不是空格,也不是字符串的结尾)。在第一个正则表达式的末尾使用单词边界:

var reg1 = new RegExp("(^|\\W)(" + match.join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var reg2 = "$1<b>$2</b>";

请注意,代替\\b,您可以使用(?!\\w)否定前瞻而不是(^|\\s),您可以使用(^|\\W)来确保您不依赖于空白关键字。如果关键字恰好位于已标记的文本中,(?!\\w|(?:[^<]*</[^>]+)?>)前瞻将使匹配失败。

第二个正则表达式需要单词边界,因为单词在连字符之间:

var reg3 = new RegExp("\\b(" + match2.join('|') + ")\\b(?!(?:[^<]*</[^>]+)?>)","ig");
var reg4 = "<b>$1</b>";

或更多才多艺:

var reg3 = new RegExp("(^|\\W)(" + match2.join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var reg4 = "$1<b>$2</b>";

此外,您需要使用关键字转义特殊的正则表达式元字符,以便将它们视为文字符号。请参阅match.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'))

参见demo(两个regexp的替换模式相同,声明一次):

&#13;
&#13;
//keyword
var keyword = "Donec <b>sed</b> odio bacon dui.";
var match = ["test.", "donec", "bacon", "dui"];
var reg = new RegExp("(^|\\W)(" + match.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var repl = "$1<b>$2</b>";
var keyword = keyword.replace(reg, repl);

console.log(keyword); 

//website
var keyword2 = "http://www.website.co.uk/hey-<b>more hello o</b>-hey-hi"; //doesnt work
var match2 = ["hello", "hey", "b"];
var reg2 = new RegExp("(^|\\W)(" + match2.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join('|') + ")(?!\\w|(?:[^<]*</[^>]+)?>)","ig");
var keyword2 = keyword2.replace(reg2, repl);

console.log(keyword2);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

不需要这个复杂的正则表达式来为已知单词添加粗体。 像这样使用替换:

1)对于全局 substr 匹配(多个替换,对于部分单词),使用:

var res = str.replace(/blog/g, "<b>blog</b>"); 

2)对于全局单词匹配(多次替换,仅限整个单词),请使用:

var res = str.replace(/\bblog\b/g, "<b>blog</b>"); 

使用\ b作为单词边界。注意“ - ”char被称为单词边界。 更容易抽象出任何单词,更容易阅读代码