我尝试使用正则表达式来匹配段落中的整个字符串(用户选择,可以是一个或多个单词(。
var str = 'myname this is my myname 18 my email is MyName@email.com 40 another email is support@MYNAME.com.au. 78 and my site is www.myname.com.au. 119 myname. 142 ..myname 154 [myname] 167 and myname's 184 mynamebefore 198 aftermynames 215 "myname" 231 'myname' 244 lastmyname';
function match(text, str) {
//need to change
var pattern = '(?=^|\s|\b)(' + text + ')(?=$|\s|\b)';
var regexp = new RegExp(pattern, "ig");
var idx = 0;
while ((match = regexp.exec(str)) != null) {
var offsetStart = parseInt(match.index);
console.log("--["+idx+"] ["+offsetStart+"]- textnode " + JSON.stringify(match, null, ' '));
idx++;
}
}
var selectText = 'myname';
match(selectText, str);
我想要的是看到下面的字符串已在字符串中突出显示。
'myname 这是我的 myname 18 我的电子邮件是 MyName@email.com 40 另一封电子邮件是 support@MYNAME.com.au. 78 我的网站是 www.myname.com.au. 119 myname. 142 ..我的名字 154 [我的名字] 167 和我的名字 184 我的名字之前 198 之后的名字 215 "我的名字" 231 '我的名字\' 244 姓氏'
跳过电子邮件,跳过URL,返回已匹配的字符串,可以用空格或任何其他字符[^a-zA-Z0-9](如[],'',"或's(包装。
所有文本都是粗体,就像 myname 会返回一样。
首先使用正则表达式匹配字符串"[^@.]"+text+"[^@.]"
然后代码中所示的每一项forEach
。
然后返回字符串。
检查代码段
var str = 'myname this is my myname 18 my email is MyName@email.com 40 another email is support@MYNAME.com.au. 78 and my site is www.myname.com.au. 119 myname. 142 ..myname 154 [myname] 167 and myname's 184 mynamebefore 198 aftermynames 215 "myname" 231 'myname' 244 myname';
function match(text, str) {
var re=new RegExp("([^@a-zA-Z0-9]|^)"+text+"(.s|[^@a-zA-Z0-9.])","igm");
str.match(re).forEach(function(i,p){
str=str.replace(i,"<b>"+i+"</b>");
});
return str;
}
var selectText = 'myname';
document.writeln("Before<br /><br />"+str);
document.write("<br /><br />After<br /><br />"+match(selectText, str));
拆分联接来首先分离潜在的候选者,但这需要捕获异常,例如在网站中使用.
时,因此想法是首先排除.
作为拆分字符,然后对于每个项目,检查是否应根据其他规则包含它(例如,如果进一步拆分.
包含name
但不包含www
(。
例如:
const text = 'myname this is my myname ...';
const name = 'myname';
// used to check if a found value is indeed ok, excludes e.g. www. texts but keeps things like '..name'; can be customized and improved to better fit the case
const check = val => val === name ||
(val.split(/./).some(_ => _ === name) && !val.split(/./).some(_ => _ === 'www')) ;
const res = text
.split(/([^a-zA-Z0-9.])/)
.map(val => check(val) ? `<b>${val}</b>` : val)
.join('');
这适用于您当前的情况,并且可能足够好。
希望这有帮助。