JavaScript匹配用户选择的整个字符串,跳过电子邮件和URL



我尝试使用正则表达式来匹配段落中的整个字符串(用户选择,可以是一个或多个单词(。

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('');

这适用于您当前的情况,并且可能足够好。

希望这有帮助。