把图里的的字和双引号js 字符串去掉双引号,改成不可能

【已失效】【反编译】apk反编译之修改贴吧发贴回帖时显示的地理位置 - 『移动安全区』
- 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|
后使用快捷导航没有帐号?
只需一步,快速开始
请完成以下验证码
请完成以下验证码
查看: 11903|回复: 34
【已失效】【反编译】apk反编译之修改贴吧发贴回帖时显示的地理位置
阅读权限10
本帖最后由 我有一只连营鹿 于
10:37 编辑
这两天看了下反编译,试了试反编译百度贴吧客户端修改发贴回帖时显示的地理位置,也算是达到效果了。在这里记录下过程跟大家分享下,上效果图先
这次用到了几个软件,包括:ApkTool、dex2jar、jd-gui、notepad++,当然还有百度贴吧的apk。
ApkTool可以将apk进行反编译和回编,楼主用的小拽的一键apktool,直接百度随便下的,其他的版本应该用法差不多。使用apktool将贴吧客户端反编译出来,结果如下图。在apktool的目录下多了一个跟贴吧apk同名的目录,放着反编译出来的东西
打开这个文件夹,目录结构如下图,/res/drawable-hdpi/目录下面是程序主要的图片ui,smali目录下是被处理过的代码,其他目录不用管
那么开始行动吧,要改变地理位置首先要在代码中找到处理地理位置的代码。茫茫代码还是处理过的蛋疼虚拟机指令语言,找起来肯定费劲,还好有notepad++,这个软件有个强大的搜索功能,可以在指定文件夹中搜索出来你要找的那几个字!
那搜索什么字呢,把玩一下度娘客户端,发现回帖的时候如果开了定位上方会出现这一行字,那是不是可以搜索一下这行字左边那张图片的名字,来找找呢?
楼主去/res/drawable-hdpi/目录下面找,发现特么的好几张那个图片。。看不出来啊区别有木有!楼主也懒得一个个试了。。这张不行不是还有很多别的图片嘛。楼主又把玩起度娘,。恩。。度娘客户端,发现点击一下定位那行字,会跳到一个选择位置的界面,列出定位附近的位置,这个界面只有一个图片有木有!就是那个对号!找起来应该比较容易。
楼主又到/res/drawable-hdpi/目录下面开始找,发现真的好想只有一张的样子,叫icon_site_ok.png,而且site不就是位置的意思嘛,这个图片应该就是我们要找的。
于是使用notepad++,在反编译出来的smali文件夹所在的目录来搜索这个文件名,得到如下图这条结果
找是找到了,但是这虚拟机指令语言这么蛋疼,改哪里怎么改呢。。还是把代码换成亲切的java来看吧。好像是有把smali直接转换成java的工具,不过楼主没研究过,这里楼主用的是把.dex文件转化为.jar文件,然后用jd-gui来看jar里面的代码。
直接将度娘客户端后缀改为zip解压出来,得到一个classes.dex文件,把这么文件放到dex2jar的目录。接着打开命令行,cd到dex2jar的目录下,然后输入dex2jar.bat classes.dex,中间有空格,等到提示Done就说明转换完成了。如果提示什么java不是可执行的之类就是电脑上没有装JDK或者JAVA环境没有配置。
得到了jar,也没法直接查看代码,需要使用一个叫jd-gui的工具,而且这工具也是只能看不能改,不过好歹能看不是么~使用jd-gui打开刚转换的jar,得到下图这样的目录结构
按照刚才搜索出来的路径,楼主这里是\baidutieba_\smali\com\baidu\tieba\selectpoi\c.smali,应该差不多,我们就顺着这个路径找到在jd-gui中寻找c.smali,jd-gui里看不到扩展名(况且这时候扩展名也不是.smali了),所以找到c就好了。
使用jd-gui看到的代码也是混淆后的,虽然不如源码直观易懂,不过比smali好看多了。我们看到这个类继承自BaseAdapter,学过安卓肯定知道这是个适配器,我们在度娘客户端看到的地理位置列表就是由它适配而来。看到代码中有个SelectLocationActivity,这个应该是使用适配器的Activity,我们可以在这个Activity中找到使用适配器的ListView,看看它的Item监听事件里都做了什么
这里我们找到了它的监听事件,可以看到当paramInt = 0的时候new了一个ResponsedSelectLocation发送出去了,第一个参数是false,应该是不显示地理位置的意思。而在paramInt不等于0的时候也new了一个ResponsedSelectLocation,但这次传了3个参数,第一个是true,大概就是显示地理位置,而第二个是个String类型,极有可能是要显示的名称,我们就要在这个参数上下功夫了。
找到了要改的位置,就要改smali文件夹中的东西了,我们按照这个路径找到\smali\com\baidu\tieba\selectpoi\b.smali,用notepad++打开b.smali这个文件。我们看到smali调用了getName()方法,然后把返回值给了v4,又在下面的构造方法中使用了v4,可见这几行就对应着上面的java代码。
现在问题就简单了,我们只需要在它使用v4之前,自己定义一个v4然后赋上我们指定的值给它用就行了。在smali中不能直接写中文,需要把中文unicode编码一下,百度unicode有很多在线编码的工具,如下图,我们把自己想要的地址编码一下
接着如下图,我们加上这句代码const-string v4, &\u592a\u9633\u7cfb\u002e\u706b\u661f\u002e\u7f8e\u7d22\u4e0d\u8fbe\u7c73\u4e9a\u5e73\u539f&,把画蓝线的部分就是双引号引起来的地方去掉,换成自己想要的编码好的地址就行。修改完后按一下Ctrl+S保存,大功告成!
改了代码之后,要想让这代码在手机上运行起来还需要把反编译出来的东西回编回去,ApkTool就有这个功能。楼主这里编译完成后的apk就在 \apktool\回编apk生成目录下。
但是这个apk还不能直接在手机上安装,因为它没有签名。有的版本的apktool就带有签名功能,楼主的这个正好没有。。。所以楼主用的是eclipse签名,把这个apk拿去签名就会得到一个签名后的apk,把签名后的apk复制到手机上就可以直接安装啦!
P.S. 如果手机上已经安装了贴吧客户端,就会因为签名冲突无法安装现在自己的这个,解决办法就是卸载掉原来安装的。。。。或者找一个没有安装过贴吧的手机来安装~安装成功后发帖回帖时会先定位当前位置,不用管他,点击定位的那行小字在新跳转的界面里随便选择一个地址就行,选择完后就会发现定位的字已经变成我们自己写的字啦!
暂时不回收,请楼主补一下图吧&
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
图挂 建议楼主右键另存为 然后上传到图床里 免费图床百度大把的
谢谢,刚来论坛不知道,还有图床一说,现在图片应该好了吧
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
恩恩 全部ok了
我的效果图有两张,编辑的时候看也是两张,怎么发出来了一直只有一张。。。你看是几张?
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
图是不是挂了 = =
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
为什么图片都变成这样了。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
楼主你是搞慈善的吧
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限20
没图怎么看啊!请把图补上!
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
上传图片到论坛,再发别引用百度的
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
图片全挂了
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限25
图挂 建议楼主右键另存为 然后上传到图床里 免费图床百度大把的
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
阅读权限10
挂图。。。
发帖求助前要善用【】功能,那里可能会有你要找的答案;如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】和【CB】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
免责声明:吾爱破解所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
( 京ICP备号 | 京公网安备 87号 )
Powered by Discuz!
Comsenz Inc.经典JavaScript正则表达式实战
匹配结尾的数字
30CAC0040 取出40
3SFASDF92 取出92
正则如下:/\d+$/g
--& \d+至少包含一个数字;$字符串结尾
统一空格个数
字符串内字符键有空格,但是空格的数量可能不一致,通过正则将空格的个数统一变为一个。
例如:蓝 色& 理 &&&想
变成:蓝 色 理 想
aobert的正则:
&script type=&text/javascript&&
var str=&蓝 色 理 想&
var reg=/\s+/g
--&\s+ 空格至少出现一次
str = str.replace(reg,& &)
document.write(str)
判断字符串是不是由数字组成
这个正则比较简单,写了一个测试
&script type=&text/javascript&&
function isDigit(str){
var reg = /^\d*$/;
return reg.test(str);
var str = &7654321&;
document.write(isDigit(str));
var str = &test&;
document.write(isDigit(str));
电话号码正则
/^\d{3,4}-\d{7,8}(-\d{3,4})?$/
区号必填为3-4位的数字,区号之后用“-”与电话号码连接
电话号码为7-8位的数字
分机号码为3-4位的数字,非必填,但若填写则以“-”与电话号码相连接
(-\d{3,4})?
手机号码正则表达式
正则验证手机号,忽略前面的0,支持130-139,150-159。忽略前面0之后判断它是11位的。
cloeft的正则:
/^0*(13|15)\d{9}$/
^0*匹配掉开头任意数量的0。
由于手机号码是13任意数字9位,和15任意数字9位,所以可以用(13|15)\d{9}匹配。
测试代码如下:
function testReg(reg,str){
return reg.test(str);
var reg = /^0*(13|15)\d{9}$/;
var str = '';
var str2 = '';
var str3 = '';
document.write(testReg(reg,str)+'&br /&');
document.write(testReg(reg,str2)+'&br /&');
document.write(testReg(reg,str3)+'&br /&');
使用正则表达式实现删除字符串中的空格:
代码以及测试代码如下:
&script type=&text/javascript&&
//删除字符串两侧的空白字符。
function trim(str){
return str.replace(/^\s+|\s+$/g,'');
//删除字符串左侧的空白字符。
function ltrim(str){
return str.replace(/^\s+/g,'');
//删除字符串右侧的空白字符。
function rtrim(str){
return str.replace(/\s+$/g,'');
//以下为测试代码
var trimTest = &
//前后各有一个空格。
document.write('length:'+trimTest.length+'&br /&');
document.write('ltrim length:'+ltrim(trimTest).length+'&br /&');
//使用ltrim后
document.write('rtrim length:'+rtrim(trimTest).length+'&br /&');
//使用rtrim后
document.write('trim length:'+trim(trimTest).length+'&br /&');
//使用trim后
测试的结果如下:
ltrim length:10
rtrim length:10
trim length:9
限制文本框只能输入数字和小数点等等
只能输入数字和小数点
var reg = /^\d*\.?\d{0,2}$/
开头有若干个数字,中间有0个或者一个小数点,结尾有0到2个数字。
只能输入小写的英文字母和小数点,和冒号,正反斜杠(:./\)
var reg = /[a-z\.\/\\:]+/;
a-z包括了小写的英文字母,\.是小数点,\/和\\分别是左右反斜线,最后是冒号。整个组成一个字符集和代码任一均可,最后在加上+,1或者多个。
替换小数点前内容为指定内容
请问 怎么把这个字符串的小数点前面的字符替换为我自定义的字符串啊?
例如:infomarket.php?id=197 替换为 test.php?id=197
应该可以把第一个点“.”之前的所有单词字符替换为test就可以了。我写的正则如下:
&script type=&text/javascript&&
var str = &infomarket.php?id=197&;
var reg = /^\w*/
//匹配字符串开头的任意个单词字符
str = str.replace(reg,'test');
document.write(str);
原帖的有点复杂,没太看明白。
只匹配中文的正则表达式
前两天看的《JavaScript开发王》里恰好有中文的unicode范围,正则如下:
/[\u4E00-\u9FA5\uf900-\ufa2d]/
写了一个简单的测试,会把所有的中文替换成“哦”。
&script type=&text/javascript&&
var str = &有中文?and English.&;
var reg = /[\u4E00-\u9FA5\uf900-\ufa2d]/
str = str.replace(reg,'哦');
document.write(str);
返回字符串的中文字符个数
一般的字符长度对中文和英文都是不分别的 如JS里的length,那么如何返回字符串中中文字符的个数呢?guoshuang老师在原帖中给出了解决方案,我又没看懂……
不过我自己也想到了一个办法:先去掉非中文字符,再返回length属性。函数以及测试代码如下:
&script type=&text/javascript&&
function cLength(str){
var reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g;
//匹配非中文的正则表达式
var temp = str.replace(reg,'');
return temp.
var str = &中文123&;
document.write(str.length+'&br /&');
document.write(cLength(str));
中文两个,数字三个,正确。
下面的测试也正确。
var str = &中文123tets@#!#%$#[][{}&;
document.write(str.length+'&br /&');
document.write(cLength(str));
正则表达式取得匹配IP地址前三段
192.168.118.101,192.168.118.72, 192.168.118.1都替换成:192.168.118
只要匹配掉最后一段并且替换为空字符串就行了,正则如下:
/\.\d{1,3}$/
匹配结尾的.n,.nn或者.nnn。
测试代码如下:
function replaceReg(reg,str){
return str.replace(reg,'')
var reg = /\.\d{1,3}$/;
var str = '192.168.118.101';
var str2 = '192.168.118.72';
var str3 = '192.168.118.1';
document.write(replaceReg(reg,str)+'&br /&');
document.write(replaceReg(reg,str2)+'&br /&');
document.write(replaceReg(reg,str3)+'&br /&');
相似的有,这个帖子里有一个验证IP地址的方法:
匹配&ul&与&ul&之间的内容
&ul&safsf&ul&safsf&/ul&&ul&safsf&/ul&&/ul&
用正则可以得到 &ul&起到下个&ul& 之间的内容。
正则如下:
/&ul&[\s\S]+?&ul&/i
首先匹配两侧的ul标签,中间的[\s\S]+?可以匹配一个或者多个任意字符,一定要非贪婪,否则会匹配&ul&safsf&ul&safsf&/ul&&ul&。
用正则表达式获得文件名
c:\images\tupian\006.jpg
可能是直接在盘符根目录下,也可能在好几层目录下,要求替换到只剩文件名。
xlez的正则如下:
/[^\\\/]*[\\\/]+/g
首先匹配非左右斜线字符0或多个,然后是左右斜线一个或者多个。形如“xxx/”或者“xxx\”或者“/”或者“\”
函数以及测试代码:
&script type=&text/javascript&&
function getFileName(str){
var reg = /[^\\\/]*[\\\/]+/g;
//xxx\或者是xxx/
str = str.replace(reg,'');
var str = &c:\\images\\tupian\\006.jpg&;
document.write(getFileName(str)+'&br /&');
var str2 = &c:/images/tupian/test2.jpg&;
document.write(getFileName(str2));
注意,\需要转义。
绝对路径变相对路径
将&IMG height=&120& width=&800& src=&http://23.123.22.12/image/somepic.gif& alt=&经典JavaScript正则表达式实战&&转换为:&IMG height=&120& width=&800& src=&/image/somepic.gif& alt=&经典JavaScript正则表达式实战&&。
其中网址可能改变,例如http://localhost等等。
cloudchen的正则:
/http:\/\/[^\/]+/
首先是http://,然后[^\/]+找过1个或者多个非/字符,因为遇到第一个/表示已经到目录了,停止匹配。
测试代码如下:
&script type=&text/javascript&&
var str = '&IMG height=&120& width=&800& \
src=&http://23.123.22.12/image/somepic.gif& alt=&经典JavaScript正则表达式实战&&';
var reg = /http:\/\/[^\/]+/;
str = str.replace(reg,&&);
alert(str)
用户名正则
用于用户名注册,,用户名只 能用 中文、英文、数字、下划线、4-16个字符。
hansir和解决方案弄成正则:
/^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/
中文字符或者单词字符,4到16个。实现4到16结成到正则里的关键就是开始^和结束$,这就等于整个字符串只能有这些匹配的内容,不能有多余的。
函数和测试代码如下:
&script type=&text/javascript&&
function isEmail(str){
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d\w]{4,16}$/;
return reg.test(str);
var str = '超级无敌用户名regExp';
var str2 = '捣乱的@';
var str3 = '太短'
var str4 = '太长longlonglonglonglonglonglonglong'
document.write(isEmail(str)+'&br /&');
document.write(isEmail(str2)+'&br /&');
document.write(isEmail(str3)+'&br /&');
document.write(isEmail(str4)+'&br /&');
匹配英文地址
包含 &点&, &字母&,&空格&,&逗号&,&数字&,但开头和结尾不能是除字母外任何字符。
[\.a-zA-Z\s,0-9]这个字符集就实现了字母,空格,逗号和数字。最终正则如下:
/^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/
开头必须有字母,结束也必须是一个以上字母。测试代码如下:
&script type=&text/javascript&&
function testReg(reg,str){
return reg.test(str);
var reg = /^[a-zA-Z][\.a-zA-Z\s,0-9]*?[a-zA-Z]+$/;
var str = 'No.8,ChangAn Street,BeiJing,China';
var str2 = '8.No,ChangAn Street,BeiJing,China';
var str3 = 'No.8,ChangAn Street,BeiJing,China88';
document.write(testReg(reg,str)+'&br /&')
document.write(testReg(reg,str2)+'&br /&')
document.write(testReg(reg,str3)+'&br /&')
正则匹配价格
价格的格式应该如下:
开头数字若干位,可能有一个小数点,小数点后面可以有两位数字。hansir给出的对应正则如下:
/^(\d*\.\d{0,2}|\d+).*$/
hansir给出的测试代码如下:
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml&&
&meta http-equiv=&Content-Type& content=&text/ charset=gb2312& /&
&title&无标题文档&/title&
&script type=&text/javascript&&
function checkPrice(me){
if(!(/^(?:\d+|\d+\.\d{0,2})$/.test(me.value))){
me.value = me.value.replace(/^(\d*\.\d{0,2}|\d+).*$/,'$1');
&input type=&text& onkeyup=&checkPrice(this);&/&
身份证号码的匹配
身份证号码可以是15位或者是18位,其中最后一位可以是X。其它全是数字,正则如下:
/^(\d{14}|\d{17})(\d|[xX])$/
开头是14位或者17位数字,结尾可以是数字或者是x或者是X。
测试代码如下:
&script type=&text/javascript&&
function testReg(reg,str){
return reg.test(str);
var reg = /^(\d{14}|\d{17})(\d|[xX])$/;
var str = '345';//15位
var str2 = '345678';//18位
var str3 = '34567X';//最后一位是X
var str4 = '1234';//位数不对
document.write(testReg(reg,str)+'&br /&');
document.write(testReg(reg,str2)+'&br /&');
document.write(testReg(reg,str3)+'&br /&');
document.write(testReg(reg,str4)+'&br /&');
要求文本有指定行数
匹配至少两行的字符串,每行都为非空字符。
只要匹配到[\n\r]就表示有换行了,再保证换行的两段都不是空字符就可以了。正则如下:
/\S+?[\n\r]\S+?/i
这个正则的应用应该是用在textarea里,如果是如下要求:可以支持所有字符,中间可带空格,可以包括英文、数字、中文、标点
这样的话,只要针对空格再改一下就行了。(按照非空的要求,上面有不能匹配“字符+空格+换行+字符”的字符串)。修改如下:
/\S+?\s*?[\n\r]\s*?\S+?/i
单词首字母大写
每单词首字大写,其他小写。如blue idea转换为Blue Idea,BLUE IDEA也转换为Blue Idea
cloeft的正则:
/\b(\w)|\s(\w)/g
所谓“首字母”包括两种情况:第一种是边界(开头)的单词字符,一种是空格之后的新单词的第一个字母。测试代码如下:
&script type=&text/javascript&&
function replaceReg(reg,str){
str = str.toLowerCase();
return str.replace(reg,function(m){return m.toUpperCase()})
var reg = /\b(\w)|\s(\w)/g;
var str = 'blue idea';
var str2 = 'BLUE IDEA';
var str3 = 'Test \n str is no good!';
var str4 = 'final test';
document.write(replaceReg(reg,str)+'&br /&');
document.write(replaceReg(reg,str2)+'&br /&');
document.write(replaceReg(reg,str3)+'&br /&');
document.write(replaceReg(reg,str4)+'&br /&');
正则验证日期格式
yyyy-mm-dd格式
正则如下:
/^\d{4}-\d{1,2}-\d{1,2}$/
4位数字,横线,1或者2位数字,再横线,最后又是1或者2位数字。
测试代码如下:
&script type=&text/javascript&&
function testReg(reg,str){
return reg.test(str);
var reg = /^\d{4}-\d{1,2}-\d{1,2}$/;
var str = '';
var str2 = '';
var str3 = '08-08-2008';
var str4 = '';
document.write(testReg(reg,str)+'&br /&');
document.write(testReg(reg,str2)+'&br /&');
document.write(testReg(reg,str3)+'&br /&');
document.write(testReg(reg,str4)+'&br /&');
第二种格式:来源:
yyyy-mm-dd
yyyy/mm/dd
用“或”简单地修改一下就行了。
/^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}$/
去掉文件的后缀名
/dc/fda.asp变为/dc/fda
如果文件后缀已知的话这个问题就非常简单了,正则如下:
匹配最后的.asp而已,测试代码如下:
&script type=&text/javascript&&
function delAspExtension(str){
var reg = /\.asp$/;
return str.replace(reg,'');
var str = '/dc/fda.asp';
document.write(delAspExtension(str)+'&br /&');
如果文件名未知的话就用这个正则:/\.\w+$/,测试代码如下:
&script type=&text/javascript&&
function delExtension(str){
var reg = /\.\w+$/;
return str.replace(reg,'');
var str = '/dc/fda.asp';
document.write(delExtension(str)+'&br /&');
var str2 = 'test/regular/fda.do';
document.write(delExtension(str2)+'&br /&');
var str3 = '/dc/fda.strange_extension';
document.write(delExtension(str3)+'&br /&');
验证邮箱的正则表达式
来源:找javascript写的表单检查代码!
fuchangxi的正则:
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
开始必须是一个或者多个单词字符或者是-,加上@,然后又是一个或者多个单词字符或者是-。然后是点“.”和单词字符和-的组合,可以有一个或者多个组合。
&script type=&text/javascript&&
function isEmail(str){
var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
return reg.test(str);
var str = '';
document.write(isEmail(str)+'&br /&');
var str2 = 'test@';
document.write(isEmail(str2)+'&br /&');
var str3 = 'te-.cn';
document.write(isEmail(str3)+'&br /&');
var str4 = 'te_st@';
document.write(isEmail(str4)+'&br /&');
var str5 = 'te.._st@';
document.write(isEmail(str5)+'&br /&');
我不太了解邮箱的具体规则。感觉这个正则比较简单,里有比较详细的邮箱正则讨论。
匹配源代码中的链接
能够匹配HTML代码中链接的正则。
原帖正则:
/&a href=&.+?&&.+?&\/a&/g
感觉有点严格,首先要&a href=&&.+?&&有,而且href属性可以是一个或者多个除换行外任意字符(非贪婪)。后面是.+?&\/a&,一个或者多个除换行外任意字符(非贪婪),再加上结束标签。
有个问题,如果a的起始标签最后有空格,或者除了href还有其它属性的话,上面的正则就不能匹配这个链接了。
&a href=&asdfs& &……多了个空格。
&a id=&xx& href=&&asdfs&&……前面有属性。
重写正则:
/&a\s(\s*\w*?=&.+?&)*(\s*href=&.+?&)(\s*\w*?=&.+?&)*\s*&[\s\S]*?&\/a&/
思路如下:首先要有&a和一个空格。/&a\s/
第一个(\s*\w*?=&.+?&)*
可以匹配一个属性,属性前面可能有或者没有多余的空格,用\s*匹配;属性名肯定是单词字符,用\w*?匹配;=&.+?&就是匹配属性值了非换行字符若干个;整个括号外面加个*表示可能有任意多个属性。
(\s*href=&.+?&)
匹配href,它也是一个属性,所以只要把上面子正则表达式中的\w修改为href=就行了。
(\s*\w*?=&.+?&)*重复第一个子正则表达式,再次接受任意个属性。
\s*&,属性最后再加上若干个空格和&。
[\s\S]*?,链接的文字,可能有任何字符组成,若干个,非贪婪。
&\/a&最后是结束标签。
补充:属性名和=之间,以及=和属性值之间也可能有空格。所以要再加上几个\s*。
最后的实例代码如下:
&script type=&text/javascript&&
function findLinks(str){
var reg = /&a\s(\s*\w*?\s*=\s*&.+?&)*(\s*href\s*=\s*&.+?&)(\s*\w*?\s*=\s*&.+?&)
*\s*&[\s\S]*?&\/a&/g;
var arr = str.match(reg);
for(var i=0;i&arr.i++){
//alert(arr[i]);
document.write('link:'+arr[i]+'&br /&');
var str = '&p&测试链接:&a id = &test& href=&& title=&无敌&&经典论坛
&/a&&/p&&a? href = &/&? &蓝色理想&/a&';
var arr = findLinks(str);
会把所有的链接在页面直接显示出来。注意,
本帖遗留问题:如何执行从右到左的匹配。貌似JS或者VBS没有提供这个功能2、JS或者VBS不支持&后行断言。。用什么方法实现这个功能。
匹配链接的文字
代码:&a href=&#&这里要保存&/a&,只保存链接的文本内容,标签信息删掉。
前面写过一个匹配链接的正则:
/&a\s(\s*\w*?=&.+?&)*(\s*href=&.+?&)(\s*\w*?=&.+?&)*\s*&[\s\S]*?&\/a&/
不过我们需要捕获的是文字内容,所以需要做一定的修改。第一步就是在所有的括号内都加上?:表示不捕获。第二步就是再多加一个括号放在[\s\S]*?两侧,这样就可以捕获到链接的文字内容了。最后正则如下:
/&a\s(?:\s*\w*?\s*=\s*&.+?&)*(?:\s*href\s*=\s*&.+?&)(?:\s*\w*?\s*=\s*&.+?&)*\s*&([\s\S]*?)&\/a&/
测试代码如下:
&script type=&text/javascript&&
function anchorText(str){
var reg =/&a\s(?:\s*\w*?\s*=\s*&.+?&)*(?:\s*href\s*=\s*&.+?&)(?:\s*\w*?\s*=\s*&.+?&)*\s*&
([\s\S]*?)&\/a&/;
str = str.replace(reg,'$1');
var str = '&a id = &test& href=&& title=&无敌&&经典论坛&/a&';
document.write(anchorText(str));
正则判断标签是否闭合
例如:&img xxx=”xxx” 就是没有闭合的标签;
&p&p的内容,同样也是没闭合的标签。
从简单的正则开始,先匹配起始标签
/&[a-z]+/i
再加上若干属性:
/&[a-z]+(\s*\w*?\s*=\s*&.+?&)*/i
下面就到关键点了,标签的闭合。标签可能有两种方式闭合,&img xxx=”xxx” /&
或者是&p&xxx &/p&。
匹配img类的结束,即/&。
(\s*?&[\s\S]*?&\/\1&)
匹配\p类标签的结束标签。&是其实标签末尾,之后是标签内容若干个任意字符,最后的&\/\1&就是结束标签了。
加上一个或就可以解决了,最后的完整正则表达式:
整个正则:
/&([a-z]+)(\s*\w*?\s*=\s*&.+?&)*(\s*?&[\s\S]*?&\/\1&|\s*\/&)/i
拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如
&div&aaaaaa&div&test&/div&
也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下:
/&([a-z]+)(\s*\w*?\s*=\s*&.+?&)*(\s*?&[\s\S]*?(&\/\1&)+|\s*\/&)/i
用正则获得指定标签的内容
有如下代码:
&title&蓝色理想&/title&
&/channel&
&title&界面设计测试规范&/title&
&title&《古典写实美女》漫画教程&/title&
&title&安远――消失的光年&/title&
&title&asp.net 2.0多语言网站解决方案&/title&
要求匹配item里的title而不匹配channel里的title。
基本正则:
/&title&[\s\S]*?&\/title&/gi
首先是title标签,内容为任意字符若干个,然后是title结束标签。这个正则已经能匹配到所有的title标签。
首先,我简单地修改了一下原正则:
/&title&[^&&]*?&\/title&/gi,
因为title里面不应该再嵌有其它标签,这个正则同样是匹配所有标题的内容,最后再加上不去匹配channel中的title。整个正则如下:
/&title&[^&&]*?&\/title&(?!\s*&\/channel&)/gi
(?!\s*&\/channel&)表示要匹配字符串的后面不能跟着若干个空格和一个channel的结束标签。
原帖里有很方便的测试工具,这里就不给测试代码了。
正则判断是否为数字与字母的混合
不能小于12位,且必须为字母和数字的混合。
验证字符串包含数字简单,验证字符串包含字母也简单,验证字符串不包含其它字符也简单,可以用这三个正则分别检查一次字符串,逻辑运算出最终结果。
但是怎么能把这些功能写进一个正则表达式里呢?这个问题真有点伤脑筋。
下面是lexrus的正则:
/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/ig
思路非常的清晰啊:
[a-z]+(?=[0-9])
字母开头,后面必须紧跟着数字。
[0-9]+(?=[a-z]
数字开头,后面必须紧跟着字母。
[a-z0-9]+
后面的字符只要是数字或者字母就可以了。经过测试,发现不好使,123dd会被识别为不合法,dd123则为合法,可见“数字开头,紧跟字母”的正则没有起作用。测试代码如下:
&script type=&text/javascript&&
function istrue(str){
var reg=/^([a-z]+(?=[0-9])|[0-9]+(?=[a-z]))[a-z0-9]+$/
return reg.test(str);
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '2';
document.write(istrue(str)+'&br /&');
document.write(istrue(str2)+'&br /&');
document.write(istrue(str3)+'&br /&');
document.write(istrue(str4)+'&br /&');
false,true,false,false
结果中的第三个,将'123dd'判断为非法是错误的。刚开始以为是g的问题,去掉了还是不好使。应该是浏览器bug,我认为lexrus的正则是正确的,可能是浏览器无法处理或”|”的两边都包含正向预查(?=)。
修改之后的正则如下:
/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i
意思和上面差不多,但是没有使用正向预查,测试代码如下:
&script type=&text/javascript&&
function istrue(str){
var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
return reg.test(str);
var str? = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '2';
document.write(istrue(str)+'&br /&');
document.write(istrue(str2)+'&br /&');
document.write(istrue(str3)+'&br /&');
document.write(istrue(str4)+'&br /&');
false,true,true,false
空格与英文同时存在
匹配英文以及空格,要求必须既有英文字母又有空格。
这个思路和上面的差不多,只要把数字改成空格就可以了。正则如下:
/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i
英文开头加空格,或者是空格开头加英文,后面可以是英文或者空格。测试代码如下:
&script type=&text/javascript&&
function istrue(str){
var reg=/^(([a-z]+\s+)|(\s+[a-z]+))[a-z\s]*$/i;
return reg.test(str);
var str? = 'asdf';
var str2 = 'sadf sdf';
var str3 = 'asdf ';
document.write(istrue(str)+'&br /&');
document.write(istrue(str2)+'&br /&');
document.write(istrue(str3)+'&br /&');
利用这个思路也可以实现英文空格英文,英文单词多于两个的匹配。同样,也可以把英文字母换成单词字符\w。
显示或者保存正则表达式匹配的部分内容
有如下电话号码:
要求,要求只匹配135开头的电话,但是匹配结果只保留135后面的数字。
由于JavaScript里的正则不支持(?=xx)xxx的模式,只支持xxx(?=xx)的模式。所以只能将135后面的内容作为一个子正则表达式匹配的内容,然后再在后面引用。
Carl给出的函数如下:
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,&$2&);
return &不是135打头的手机号码!&;
/^(135)(\d{8})$/
正则中,135作为开头表示第一个子正则表达式,第二个括号内的子正则表达式则匹配后面的8个数字,然后在replace中使用$2就可以引用这个子正则表达式匹配的内容了。测试代码如下:
&script type=&text/javascript&&
function f(phoneNumber) {
var pattern = /^(135)(\d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,&$2&);
return &不是135打头的手机号码!&;
var arr = new Array(
for(var i = 0; i & arr. i++)
document.write(f(arr[i])+'&br /&');
正则表达式替换变量
有一个数组:
var _A = ['A','B','C','D'];
有一个有“变量”的字符串。
var _B = '&ul&&li&$0$&/li&&li&$1$&/li&&li&$2$&/li&&li&$3$&/li&&/ul&';
说是变量,其实只是字符串中的特殊字符,例如$0$,就称这个为伪变量吧。
最后的要求就是使用正则获得下面这样一个字符串:
_C = '&ul&&li&A&/li&&li&B&/li&&li&C&/li&&li&D&/li&&/ul&';
IamUE给出了代码:
&script type=&text/javascript&&
var _A = ['A','B','C','D'];
var _B = '&ul&&li&$0$&/li&&li&$1$&/li&&li&$2$&/li&&li&$3$&/li&&/ul&';
var reg=/\$\d+\$/
C=_B.replace(reg,function($1){
var indexnum=$1.replace(/\$/ig,&&);
if (indexnum&_A.length)
{return _A[indexnum];}
else{return &&}
代码分析:看到代码之后感觉有点晕,首先,正则reg中没有任何的括号,应该是没有捕获内容的,那么后面怎么又使用$1了引用了呢?通过alert测试,发现它是整个正则匹配的内容,而且不一定要写作$1,可以写为$0,甚至是写为x都没关系,它总是整个匹配。
第一次,$1匹配到_B中的“$0$”,匿名函数中将它的$去掉,变成了0,检查是否越界之后,用这个0作为下标去访问数组_A。
由于正则reg定义了g属性,所以会继续替换$1$、$2$等等。步骤都和上面一样。
正则替换指定属性中的文本
有如下代码:
&td align=&center&&&img src=&../photo/ccg/thumbnails/O'Malley's West_jpg.gif& alt=&经典JavaScript正则表达式实战& border=&0& onClick=&MM_openBrWindow('../photo/ccg/pages/O'Malley's West_jpg.htm','BE','width=386,height=306')&&&br&
O'Malley's West&/td&
要求将所有onclick属性中的’替换成\’,也就是将单引号转义。
首先,需要匹配onclick属性:
/onclick\s*=\s*&.+?&/ig
然后再将所有的’都替换成\’就可以了。
将阿拉伯数字替换为中文大写形式
将123替换成壹贰叁。
只要匹配一个数字就可以了,测试代码如下(如果显示为乱码就调整一下浏览器的字符编码):
function replaceReg(reg,str){
return str.replace(reg,function(m){return arr[m];})
arr=new Array(&零&,&壹&,&贰&,&叁&,&肆&,&伍&,&陆&,&柒&,&捌&,&玖&);
var reg = /\d/g;
var str = '';
var str2 = '';
var str3 = '';
document.write(replaceReg(reg,str)+'&br /&');
document.write(replaceReg(reg,str2)+'&br /&');
document.write(replaceReg(reg,str3)+'&br /&');
替换文本中的URL为链接
将一个用户输入的一段文字中的url替换成可以点击的link地址。例如:可以替换成 [url][/url]
或&a href=&&&http://www. &/a&.
这个正则的关键就在于匹配链接,匹配之后,在两边加上a标签和属性不是问题。
/http:\/\/[\w-]*(\.[\w-]*)+/ig
首先匹配http://。
[\w-]*是可能的www和bbs等。
\.[\w-]*匹配.xxx形式,至少有一个。
测试代码如下:
&script type=&text/javascript&&
function replaceReg(reg,str){
return str.replace(reg,function(m){return '&a href=&'+m+'&&'+m+'&/a&';})
var reg = /http:\/\/[\w-]*(\.[\w-]*)+/
var str = '将一个用户输入的一段文字中的url替换成可以点击的link地址。\
测试一下:紧接着中文,还有 \
is very good!!最后在看看带.cn的:.cn呵呵。';
document.write(replaceReg(reg,str)+'&br /&');
从HTML代码段删除指定标签极其内容
在一段代码中去除&script ...... /script&, &head&...&/head&,&%.....%&等代码块
隆的正则:
/&(script|meta|%)[\s\S]*?\/(script|meta|%)&/
试了一下,匹配如下文本正常:
&script type=&text/javascript&&
我是要被删除的脚本
哎。就剩下我了。
但是,如果使用类似的正则:
/&(script|head|%)[\s\S]*?\/(script|head|%)&/ig
匹配有嵌套的标签:
&script type=&text/javascript&&
我是要被删除的脚本
哎。就剩下我了。
实际匹配的内容是:
&script type=&text/javascript&&
我是要被删除的脚本
这是因为[\s\S]*?里的非贪婪造成的。可以使用JavaScript正则里的反向引用来解决这个问题,如果起始标签匹配了head,那么结束标签也必须是head。最后的正则如下:
/&(script|head|%)[\s\S]*?\/\1&/ig
用正则给文本分段
原代码:[title]标题一[/title]内容一232323sdfga [title]标题二[/title]内容二2232323 [title]标题三[/title]内容三2232323
要把文本分段成如下格式:
一、[title]标题一[/title]内容一232323sdfga
二、[title]标题二[/title]内容二2232323
三、[title]标题三[/title]内容三2232323
只要用正则匹配title就可以了,所以正则比较简单
/\[title\]/ig
至于开始的的汉字序号,只要一个数组就解决了,最终代码如下:
&script type=&text/javascript&&
function replaceReg(reg,str){
var mark =0;
return str.replace(reg,function(m){mark++;return '&br /&'+arr[mark]+'、'+m;})
var arr = [&零&,&壹&,&贰&,&叁&,&肆&,&伍&,&陆&,&柒&,&捌&,&玖&];
var reg = /\[title\]/
var str = '[title]标题一[/title]内容一232323sdfga \
[title]标题二[/title]内容二2232323 [title]标题三[/title]内容三2232323';
document.write(replaceReg(reg,str)+'&br /&');
转换源代码中的标签
将代码中的HTML标签img转换为
共&0 张图片
/&img(?:\s*\w*?\s*=\s*&.+?&)*?\s*src\s*=\s*&(.+?)&(?:\s*\w*?\s*=\s*&.+?&)*\s*&/ig
这段正则和匹配链接标签的正则基本一样,修改如下,标签名img,没有结束标签而是&结束。
测试代码如下:
&script type=&text/javascript&&
function replaceReg(reg,str){
return str.replace(reg,'$1
共 0 张图片%MINIFYHTMLe0faf88cd171f9662fcef15%')
/&img(?:\s*\w*?\s*=\s*&.+?&)*?\s*src\s*=\s*&(.+?)&(?:\s*\w*?\s*=\s*&.+?&)*\s*&/
var str = '我就是传说中的图片了&img src=&URL&&哎。';
document.write(replaceReg(reg,str)+'&br /&');
第二个是替换object代码嵌入的flash代码替换为[swf]url[/swf]。
针对原文的正则如下:
/&object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*&\/object&/i
如果是所有的属性都有双引号的话正则也需要修改。
测试如下:
&script type=&text/javascript&&
function replaceReg(reg,str){
return str.replace(reg,'[swf]$1[/swf]')
var reg = /&object[\s\S]*?src=([\s\S]+?)(?=\s)[\s\S]*&\/object&/i;
var str = '&object classid=clsid:D27CDB6E-AE6D-11cf-96B8- \
codebase=/pub/shockwave/cabs/flash/\
swflash.cab#version=5,0,0,0 width=255 height=250&&param name=movie \
value=url&&param name=quality value=high&&embed src=url quality=high \
pluginspage=/shockwave/download/index.cgi?\
P1_Prod_Version=ShockwaveFlash type=application/x-shockwave-flash \
width=255 height=250&&/embed&&/object&';
document.write(replaceReg(reg,str)+'&br /&');
给属性添加双引号
给HTML标签中的属性添加双引号。
&a href=xxx&改为:&a href=&xxx&&
LeXRus的第一个正则如下:
/(?!\&\w+)(\s+\w+)\=([^&\&\s]+)/ig
第一个括号没看明白,JS应该是不支持。所以我擅自给删掉了,剩下的正则如下:
/(\s+\w+)\=([^&\&\s]+)/ig
第一个括号里的\s+\w+匹配的是属性名。
然后是=,不用转义。
第二个括号里的[^&\&\s]+匹配属性值。不匹配&”和空格。这里的引号不用转义。在意思不改变的情况下,稍微改了改,正则如下:
/(\s+\w+)=([^&&\s]+)/ig
需要注意的是这个正则不匹配=两边有空格的属性,例如href = xxx。相匹配的话就改成:
/(\s+\w+)\s*=\s*([^&&\s]+)/ig
str=str.replace(/(?!\&\w+)(\s+\w+)\=([^&\&\s]+)/ig,'$1=&$2&');
其中’$1=”$2”’就实现了给属性值添加上双引号。不过ncs指出了这个正则替换的几个问题,一是上面的空格问题,二是如果非标签内部有等号,且前面又恰巧有空白字符的话,它将会被误识别为属性,例如:
&a href=xxx target=yyy title = asdfasf& test=sd
里面的test=sd也会被匹配。三是如果属性原来使用了单引号,会被再包上一层双引号……
来看看LeXRus前辈的新正则替换方法:
str=str.replace(/(?!&\w+)(\s+\w+)\s*=\s*([^&\&\s]+)(?=[^&]*&)/ig,'$1=&$2&')
.replace(/\&\'([^\'\&]+)\'\&/ig,'\&$1\&');
先来看第一个正则:
/ (\s+\w+)\s*=\s*([^&&\s]+)(?=[^&]*&)/ig
结尾新添的(?=[^&]*&)意在解决普通文本中有等号被误识别为属性的问题:
&a href=xxx target=yyy title = asdfasf& test=sd
就没问题了,但是
&a href=xxx target=yyy title = asdfasf& test=sd&tag&又一个标签&/tag&
中的test=sd&tag&又会被识别为属性。
我觉得改成下面的正则就没问题了:
/(\s+\w+)\s*=\s*([^&&&\s]+)(?=[^&&]*&)/ig
分别在第二个括号的字符集合和最后的反向预查的字符集合中添加了一个&。
下面再来分析第二个正则,
/\&\'([^\'\&]+)\'\&/ig
这个正则用于匹配双引号,单引号多层嵌套的情况,同样,不用转义,修改正则如下:
/&'([^'&]*)'&/ig
这样基本任务就完成了。测试代码如下:
&script type=&text/javascript&&
function rp(str,trg){
var reg1 = /(\s+\w+)\s*=\s*([^&&&\s]+)(?=[^&&]*&)/ig
var reg2 = /&'([^'&]*)'&/
str=str.replace(reg1,'$1=&$2&').replace(reg2,'\&$1\&');
trg.value=
&textarea id=&sou& style=&width:100%&&
&a href = xxx name=aaa target=_blank title='asdfasf'
onclick=alert('blueidea')& asfd=asfd
&/textarea&
&input type=&button& onclick=&rp(sou.value,sou)& value=&replace&/&
原帖里LeXRus又提出了新问题:
hint=i am lexrus
这样的属性会有问题,不过我感觉不加引号的话,属性值里就不可能有空格,否则会被识别为多个属性了。不过看到最后ncs的回帖我就哭了:
onclick=if(document.forms.length&0)
这样的属性怎么办?大于号会被识别为标签结束……还是分离行为与文档吧。补充一下,其实修补一下正则也可以解决,只要改成如下正则即可:
/(\s+\w+)\s*=\s*([^&\s]+)(?=[^&&]*&)/ig
就是去掉第二个括号内字符集合里的&&。最后这个问题也解决。
给table加上tbody
有若干table,但是没有tbody。现在需要用正则批量加上。
匹配table结束标签&/table&比较简单,在前面加上一个&/tbody&就行了。
但是,匹配table的起始标签有点难度,因为可能有属性。不过之前匹配过链接了,这个也大同小异。
实例table代码如下:
&table width=&100%& border=&0& cellpadding=&2& cellspacing=&3&&
&table width=&100%&&
/&table\s(\s*\w*?\s*=\s*&.+?&)*?\s*?&/g
匹配一个&table,在匹配若干个属性,最后只要再找到&就代表标签结束。
之后再replace一下,加上&tbody&就可以了。
去掉标签的所有属性
&td style=&width: 23 height: 26& align=&left&&***&/td&
变成没有任何属性的
&td&***&/td&
思路:非捕获匹配属性,捕获匹配标签,使用捕获结果替换掉字符串。正则如下:
/(&td)\s(?:\s*\w*?\s*=\s*&.+?&)*?\s*?(&)/
首先,td匹配掉了标签,后面可以用$1引用,后面的若干属性被(?:)匹配掉,而最后匹配的&则可以在后面用$2引用。
示意代码:
str = str.replace(reg,’$1$2’);
正则替换特定单词
要求禁止输入某几个单词,如果拒绝red,yellow,white。这个帖子到时不难,但是让我弄清楚了好几个概念。
第一个,小心字符集合里的“或”
/[^red|yellow|white]/
这个正则里的所有或都没有意义,等同于:
/[^redyellowwhite]/
意思就是不能含有以下列出的所有字母。
/red|yellow|white/
第二个概念:
只要整个正则匹配成功,无论子正则表达式是否匹配成功,括号都会捕捉。例如
/(red)|(yellow)|(white)/
会捕捉到三个结果,尽管实际上最多只可能有一个括号匹配成功。但是只要有一个匹配到了,两外两个也会记录空串。
指定文字高亮显示
不劳而获一次,这个子虚乌有前辈已经给出了非常好的解决方案:我直接把代码贴出来了:
&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN&
&http://www.w3.org/TR/2000/REC-xhtml1-/DTD/xhtml1-transitional.dtd&&
&html xmlns=&http://www.w3.org/1999/xhtml&&
&meta http-equiv=&Content-Type& content=&text/ charset=gb2312& /&
&META name=&Author& content=&Sheneyan& /&
&script type=&text/javascript&&
function encode(s){
s.replace(/&/g,&&&).replace(/&/g,&&&).replace(/&/g,&&&).replace(/([\\\.\*\[\]\(\)\$\^])/g,&\\$1&);
function decode(s){
s.replace(/\\([\\\.\*\[\]\(\)\$\^])/g,&$1&).replace(/&/g,&&&).replace(/&/g,&&&).replace(/&/g,&&&);
function highlight(s){
if (s.length==0){
alert('搜索关键词未填写!');
s=encode(s);
var obj=document.getElementsByTagName(&body&)[0];
var t=obj.innerHTML.replace(/&span\s+class=.?highlight.?&([^&&]*)&\/span&/gi,&$1&);
obj.innerHTML=t;
var cnt=loopSearch(s,obj);
t=obj.innerHTML
var r=/{searchHL}(({(?!\/searchHL})|[^{])*){\/searchHL}/g
t=t.replace(r,&&span class='highlight'&$1&/span&&);
obj.innerHTML=t;
alert(&搜索到关键词&+cnt+&处&)
function loopSearch(s,obj){
var cnt=0;
if (obj.nodeType==3){
cnt=replace(s,obj);
for (var i=0,c;c=obj.childNodes[i];i++){
if (!c.className||c.className!=&highlight&)
cnt+=loopSearch(s,c);
function replace(s,dest){
var r=new RegExp(s,&g&);
var t=dest.nodeV
var cnt=0;
if (tm=t.match(r)){
t=t.replace(r,&{searchHL}&+decode(s)+&{/searchHL}&)
dest.nodeValue=t;
&style type=&text/css&&
.highlight{background:font-weight:color:}
&form onsubmit=&highlight(this.s.value);&&
&p&&input name=&s& id=&s& title=&搜索内容:&/&&input type=&submit& value=&搜索&/&&/p&
&div id=&content&&
测试高亮的代码。很长很长的代码……………………
删除除了&img&、&br&、&p&之外所有的标签。子虚乌有给出代码中关键的一句:
o.innerHTML.replace(/(&\/?(?!br|p|img)[^&\/]*)\/?&/gi,'');
刚开始没反应过来,后来才想起来,这个正则不用区分起始和结束标签。
&\/?(?!br|p|img)
匹配除了保护标签外标签的起始标签或者是结束标签的一部分。
匹配到&或者/就结束。
起始标签或者结束标签的结尾。
:反斜线灾难。
我从来没用过UBB,这个关于UBB的帖子,我觉得比较难,就没有总结:。
JSON我也不太明白,这个贴还没看,以后学了JSON再说。。
还有一个挺难的帖子,,感觉不应该用正则。
正则表达式做打字练习游戏:。里面有位高手做出来了,不过是只在IE下有效。
匹配数字的“正则”
匹配数字字符挺简单,但是匹配正数,负数之类的还真挺麻烦。不过子虚乌有前辈的一句话到是非常经典:“不要一想到验证就想去用正则”。
是啊,不会正则的时候使劲躲,看了两天正则恨不得JavaScript编程“正则Script”。
类似的:
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?}

我要回帖

更多关于 js去掉字符串的双引号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信