40分请正则大虾帮忙写个正则表达式。

luohuayh 2009-11-16 01:17:20

var str="c";
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,\'over\')" onmouseout="' +this.name+'.dddd(this,\'out\')">abcdefgada</div>';
用正则表达式匹配后想要得到的结果如下:
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,\'over\')" onmouseout="' +this.name+'.dddd(this,\'out\')"><strong>c</strong>badefg<strong>c</strong>d<strong>c</strong><div>';


要求用js语言实现。
...全文
186 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
663710209
答案是"卡片多多"
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 muxrwc 的回复:]
客气...继续沉...
[/Quote]
我想和你交个朋友,不知道你愿不愿意呢?
muxrwc 2009-11-16
  • 打赏
  • 举报
回复

客气...继续沉...
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
我学到了很多!谢谢!!!
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 muxrwc 的回复:]
额...为什么要换...
如果要换的话...
注意下转义就可以了。。。
JScript codevar expression=new RegExp('(<(?:"[^"]*"|\'[^\']*\'|[^"\'>]+)+>)|(?:(?!<\\/?\\w)[\\S\\s])+','g');
[/Quote]
真心的谢谢大虾,我的问题结束了,可以结贴给分了!
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
额...为什么要换...
如果要换的话...
注意下转义就可以了。。。

var expression = new RegExp('(<(?:"[^"]*"|\'[^\']*\'|[^"\'>]+)+>)|(?:(?!<\\/?\\w)[\\S\\s])+', 'g');
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
形式参数...
return function (text, handler) {
这里的第二个参数就是它...
replaceInTextNode(document.getElementsByTagName('textarea')[0].value, function (v) {
调用的时候传了个函数进去...
这个函数可以对捕获到的textNode处理
把c加粗的操作就在这里做
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
还有,如果把
var expression = /(<(?:"[^"]*"|'[^']*'|[^"'>]+)+>)|(?:(?!<\/?\w)[\S\s])+/g;
这句换成
var reg = new RegExp('(<(?:"[^"]*"|'[^']*'|[^"'>]+)+>)|(?:(?!<\/?\w)[\S\s])','g');
那么该段代码该如何改动才能使用?
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 muxrwc 的回复:]
式子的思路是
把目标字符看成两类...
一类是html标记(HTMLElement)
另一类是文本(就是textNode里的nodeValue
所以式子分两部分
左边那部分是匹配HTMLElement的匹配到后放到$1里...
右边那部分是匹配textNode的...
中间 | 连接...
replace可以传一个函数进去...
每次匹配成功后都会调用这个函数取返回值为replacement.
对于这里.会把
匹配到的东西(lastMatch)放到arguments[0]
$1放到arguments[1](里面是HTMLElement)

所以从函数里判断下,如果有$1那么就忽略.
否则就
处理下匹配到的东西(lastMatch)
[/Quote]
谢谢大虾为我耐心解释。
那么再请问那个
handler(lastMatch);
这个方法是在哪定义的呢?
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
= =,最后...
一定要用#5的代码,否则会出现不和谐的问题...
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
式子的思路是
把目标字符看成两类...
一类是html标记(HTMLElement)
另一类是文本(就是textNode里的nodeValue
所以式子分两部分
左边那部分是匹配HTMLElement的匹配到后放到$1里...
右边那部分是匹配textNode的...
中间 | 连接...
replace可以传一个函数进去...
每次匹配成功后都会调用这个函数取返回值为replacement.
对于这里.会把
匹配到的东西(lastMatch)放到arguments[0]
$1放到arguments[1](里面是HTMLElement)

所以从函数里判断下,如果有$1那么就忽略.
否则就
处理下匹配到的东西(lastMatch)
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
能不能把那个思路说一下?谢谢!
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 muxrwc 的回复:]
re #2
直接 copy #1的代码
运行后
那个比较大的textarea里是结果.
[/Quote]
结果出来了,那么请问大虾,那个
return String(text).replace(expression, function (lastMatch, $1) {
return $1 ? $1 : handler(lastMatch);
这句代码的作用是什么?能帮小弟解释下吗?拜托了!
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
...
哦...有个bug,修改下...
代码如下...

<textarea>
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">abcdefgada </div>
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">
abcde
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">abcdefgada </div>
fgada </div>
</textarea>
<textarea style="width:700px; height:500px;">
</textarea>
<script type="text/javascript">
var replaceInTextNode = function () {
var expression = /(<(?:"[^"]*"|'[^']*'|[^"'>]+)+>)|(?:(?!<\/?\w)[\S\s])+/g;
return function (text, handler) {
return String(text).replace(expression, function (lastMatch, $1) {
return $1 ? $1 : handler(lastMatch);
});
};
}();

var key = 'c';
document.getElementsByTagName('textarea')[1].value = replaceInTextNode(document.getElementsByTagName('textarea')[0].value, function (v) {
alert(v);
return v.replace(new RegExp('(' + key + ')', 'g'), '<strong>$1</strong>');
});
</script>
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 muxrwc 的回复:]
re #2
直接 copy #1的代码
运行后
那个比较大的textarea里是结果.
[/Quote]
好的
muxrwc 2009-11-16
  • 打赏
  • 举报
回复
re #2
直接 copy #1的代码
运行后
那个比较大的textarea里是结果.
luohuayh 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 muxrwc 的回复:]
JScript code<textarea><div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">abcdefgada</div><div class="out" on?-
[/Quote]
我测试得不到结果!
muxrwc 2009-11-16
  • 打赏
  • 举报
回复

<textarea>
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">abcdefgada </div>
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">
abcde
<div class="out" onclick="' +this.name+'.bbb(this)" onmouseover="' +this.name+'.ccc(this,'over')" onmouseout="' +this.name+'.dddd(this,'out')">abcdefgada </div>
fgada </div>
</textarea>
<textarea style="width:700px; height:500px;">
</textarea>
<script>
var replaceInTextNode = function () {
var expression = /(<(?:"[^"]*"|'[^']*'|[^"'>]+)+>)|(?:(?!<\w).)+/g;
return function (text, handler) {
return String(text).replace(expression, function (lastMatch, $1) {
return $1 ? $1 : handler(lastMatch);
});
};
}();

var key = 'c';
document.getElementsByTagName('textarea')[1].value = replaceInTextNode(document.getElementsByTagName('textarea')[0].value, function (v) {
return v.replace(new RegExp('(' + key + ')', 'g'), '<strong>$1</strong>');
});
</script>

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧