原始字符串 var sourceText="";
sourceText有很多种情况。 比如:
情况1: sourceText="Where there is great love, <span style="color: #0000ff; font-weight: bold;">there</span> are always miracles.";
情况2:sourceText="Where there is great love, <span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">
are</span> always miracles.";
情况3:...
需要处理的字符串:there are always
现在的需求是: 从原始字符串中找到需要处理的字符串,然后高亮加黄色背景显示。但是原始字符串里可能所有的单词都已经被加粗和加字体颜色,这样直接找"there are always"这个字符串是找不到的。需要处理的字符串可能是一个单词,也可能是一个句子。
以sourceText为情况2和需要处理的字符串是there are always举例, 需要得到的结果是:Where there is great love, <span style="background-color:yellow;font-we;ight:inherit;"><span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">
are</span> always</span> miracles.
跪求大神不吝赐教!!!
能帮忙写出code最佳!!!
一下午没弄出来,实在是没招了!!!
在线等,
Help me...
哈哈, 用大叔那一招来说就是,一个个的抓出来, 严刑拷打。
头头哥,你可以帮忙给一个小的demo吗?
在线等,大神,多谢了。
@GEEKc:
// sourceText=原始字符串, matchText=需要处理的字符串 function GetHightLight(sourceText, matchText) { var matchSyntax = "(<span[^>]*>)*" + matchText.split(" ").join("\\s*(<\/span>)*\\s*(<span[^>]*>)*") + "\\s*(<\/span>)*\\s*"; var reg = new RegExp("(" + matchSyntax + ")", "gi"); sourceText = sourceText.replace(reg, "<span style='background-color:yellow;font-weight:inherit;'>$1</span>") return sourceText; }
你可以试试上面这个代码,我在本地已经测试了, 没有问题。
你看看在你那可以不, 如果有问题就继续追问吧!
@请叫我头头哥: 测试通过。 多谢
@请叫我头头哥: 强!!!
@幻天芒: 哈哈, 其实正则不难,就是绕而已, 得慢慢拼慢慢测。 麻烦了点。
@请叫我头头哥: 我能说,我每次都要去翻文档么。记不住那些符号。
@幻天芒: 同感, 我也记不住, 要不翻文档,有个10天半个月没用正则,再让用就玩完。
你要先用正则把<>都去掉.然后就能获取到
用正则把<>都去掉? 然后怎么做呢?
吴老师如果能在百忙之中帮忙写一下code, 晚辈会万分感谢!
@GEEKc: [<].*?[>] replace("")
@吴瑞祥: 还是不太懂, 我是新人, 自己研究了一下午了。
吴老师能劳驾您帮忙写一段完整的code吗? 多谢。
@GEEKc: 不能..什么语言什么环境.都不知道.
反正就是就用正则将"[<].*?[>]"替换为空
@吴瑞祥: 就是传统的js+html, 环境什么都行, Notepad++即可
多谢吴老师了。
var sourceText ='<span style="color: #0000ff; font-weight: bold;">there</span>';
sourceText =sourceText .replace(/<span[^>]*>/g,"").replace(/<\/span>/g,"");
console.log(sourceText );
我并不是要取出there, 以sourceText为情况2和需要处理的字符串是there are always举例, 需要得到的结果是:Where there is great love, <span style="background-color:yellow;font-we;ight:inherit;"><span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">
are</span> always</span> miracles.
@GEEKc: 你不就是因为有<span>匹配不到there are always么。现在直接对处理后的字符串执行你之前执行的替换不就行了
@司幸: 因为sourceText在这之前可能就已经有span标签存在字符串里面了,如果把这些处理掉的话,是能匹配到there are always,也能追加进去,但是之前的标签就没了。这里需要保存原来的标签。
@GEEKc: 了解了,你的意思是 <span><span><span>there</span></span> are</span>aways 这种情况也是会出现的吗。替换后<span><span><span><span>there</span></span> are</span>aways </span>?
@司幸: 对,就是可能的情况是
<span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">
are</span> always 替换成 <span style="background-color:yellow;font-we;ight:inherit;"><span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">are</span> always</span>
也可能是there <span style="color: #0000ff; font-weight: bold;">are</span> always 替换成 <span style="background-color:yellow;font-we;ight:inherit;">there <span style="color: #0000ff; font-weight: bold;">are</span> always</span>
还可能是there are always 替换成 <span style="background-color:yellow;font-we;ight:inherit;">there are always</span>
也就是每个单词都有可能会被<span style="color: #0000ff; font-weight: bold;"></span>这么一组span标签所标注。我们需要从原始字符串中找到一串指定字符串加上<span style="background-color:yellow;font-we;ight:inherit;"></span>
多谢司幸老师, 有劳了 :[
@GEEKc: var tem = sourceText .match(/(<span[^>]*>)*\s*there\s*(<\/span>)*\s*(<span[^>]*>)*\s*are\s*(<\/span>)*\s*(<span[^>]*>)*\s*always\s*(<\/span>])*/g);
for(tem){
sourceText=sourceText .replace(tem[i],<span>tem[i]</span>)
}
console.log(sourceText)
@司幸: 司幸老师,这个for循环是什么语法啊? 没有这种写法吧?
跪求完整的能运行的demo。多谢了。
string pattern = @"(((<(\w+[^<]*?)>)|(?<=\b|\s))*there(<(/\w+|\w+[^<]*?)>|\b|\s)*are(<(/\w+|\w+[^<]*?)>|\b|\s)*always(\s*</\w+>|(?=\b|$))*)";
string sourceText = "Where there is great love, <span style=\"color: #0000ff; font-weight: bold;\">there</span> <span style=\"color: #0000ff; font-weight: bold;\">are</span> always miracles.";
string text = Regex.Replace(sourceText, pattern, "*$1*"); //把 * 换成你要的
这是C#正则吗? 我把这个转成JS正则以后报错了。 大神,能帮忙写一个完整点的JS正则吗?
@GEEKc:
var t='<span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">are</span> always';
var r=/(((<(\w+[^<]*?)>)|(\b|\s))*there(<(\/\w+|\w+[^<]*?)>|\b|\s)*are(<(\/\w+|\w+[^<]*?)>|\b|\s)*always(\s*<\/\w+>|(\b|$))*)/g;
var hightlight='<span style="background-color:yellow;font-we;ight:inherit;">';
document.write(t.replace(r,hightlight+"$1"+"</span>"));
@Yu: 还是不行啊, 运行的时候匹配不到情况2啊
@GEEKc: 那你测试有问题
@GEEKc: 以下是通过的
var t='Where there is great love, <span style="color: #0000ff; font-weight: bold;">there</span> <span style="color: #0000ff; font-weight: bold;">are</span> always miracles.'; var r=/(((<(\w+[^<]*?)>)|(\b|\s))*there(<(\/\w+|\w+[^<]*?)>|\b|\s)*are(<(\/\w+|\w+[^<]*?)>|\b|\s)*always(\s*<\/\w+>|(\b|$))*)/g; var hightlight='<span style="background-color:yellow;font-we;ight:inherit;">'; document.write(t.replace(r,hightlight+"$1"+"</span>"));
@Yu: 这个background-color:yellow;font-we;ight:inherit;是写错了还是正则的语法啊?
算了, 不纠结了, 答案已经有了。 谢谢Yu老师悉心指导。
@GEEKc: 写错的,改成 background-color:yellow;font-weight:inherit;
话说,你的需求应该是指定关键字高亮吧?直接用正则替换不行么?
对, 就是关键字(可能是一个句子也可能只是一个单词)高亮加黄色背景。但是原始的字符串中可能某些单词已经被做其他高亮处理(加粗加蓝色), 是需要用正则替换, 但是这个正则不会写。
幻老师可以帮忙写一个小的demo吗? 多谢了。
@GEEKc: 需要将原本的高亮干掉? 如果不需要的话,直接取出result = innerHTML.replace(/xxx/gi, '高亮之后的html代码'); 然后再赋值回去。。
@幻天芒: 嗯,就像头头老师说的那样,多谢幻老师了,在线等!
@请叫我头头哥: 多谢头头哥老师
@GEEKc: 我用正则是玩不转这个的,那就只能一层层的去解析,然后分别处理了。我的方法太复杂了,先尝试下他们提供的正则匹配嘛吧。。
@请叫我头头哥: 头头哥,我正则太弱,用正则搞不定。。。
@幻天芒: 老幻, 你也太谦虚了吧? 我看是你不愿意弄而已。 话说这个正则难倒是不难, 但是确实挺麻烦的。
@请叫我头头哥: 我看着大片的正则,我就头大。。
var words = ["there", "are", "always"];
var txt = 'Where there is great love, <span style="color: #0000ff; font-weight: bold;">there</span> \tare always miracles.'
if (new RegExp("((<.*?>)?" + words.join('(</.*?>)?\t? ?(<.*?>)?') + "(</.*?>)?)").test(txt)) txt = txt.replace(RegExp.$1, '<span style="background-color:yellow;font-we;ight:inherit;">' + RegExp.$1 + '</span>');
大神, 你这得到的结构是Where there is great love, <span style="background-color:yellow;><span style="color: #0000ff; font-weight: bold;">there</span> are always</span> miracles. 只有there被高亮了。 我的需求是words 数组里的都得高亮。、
多谢了。 能帮忙继续写写demo吗?
@GEEKc: var words = ["there", "are", "always"];
var txt = 'Where there is great love, <span style="color: #0000ff; font-weight: bold;">there</span> are always miracles.'
if (new RegExp("((<.*?>)?" + words.join('(</.*?>)? ?(<.*?>)?') + "(</.*?>)?)").test(txt)) txt = txt.replace(RegExp.$1, '<span style="background-color:yellow;font-we;ight:inherit;">' + RegExp.$1 + '</span>');
写错了 (。。。
@长蘑菇星人: 这个的确也是可以匹配出来的,但是不太符合我的这个需求。 不过还是谢谢大神。