繁体   English   中英

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

[英]JavaScript match whole string user selected, skip email and 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我的名字 142 .. myname 154 [ myname ] 167和myname \\的184 myname,在198 aftermynames 215“ myname ” 231 \\' myname \\'244 lastmyname'

跳过电子邮件,跳过URL,返回已匹配的字符串,该字符串可以用空格或任何其他字符[^ a-zA-Z0-9]包裹,例如[],“,”“或's。

所有文本均为粗体,如myname将返回。

首先使用regexp "[^@.]"+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)); 

您可以使用拆分联接来首先分离潜在的候选者,但这需要捕获异常,例如when . 用于网站中,因此首先要排除. 作为拆分字符,但是对于每个项目,请检查是否应根据其他规则将其包括在内(例如,如果进一步按.拆分,则包含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('');

这在您当前的情况下可行,可能就足够了。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM