js正则表达式实例(汇总)

对于开发人员来说,正则表达式是一个非常有用的功能,它提供了
查找,匹配,替换
句子,单词,或者其他格式的字符串。这篇文章主要介绍了15个超实用的php正则表达式,需要的朋友可以参考下。在这篇文章里,我已经编写了15个超有用的正则表达式,WEB开发人员都应该将它收藏到自己的工具包。

正则表达式(regular expression abbr. regex)
功能强大,能够用于在一大串字符里找到所需信息。它利用约定俗成的字符结构表达式来发生作用。不幸的是,简单的正则表达式对于一些高级运用,功能远远不够。若要进行筛选的结构比较复杂,你可能就需要用到高级正则表达式。

来源:如何用JAVASCRIPT 正则表达式取出字符串最后一组数字,谢谢 
如 
30CAC0040 取出40 
3SFASDF92 取出92 
正则如下://d+$/g 
 
统一空格个数 
来源:正则匹配空格的问题 
字符串内字符键有空格,但是空格的数量可能不一致,通过正则将空格的个数统一变为一个。 
例如:蓝色理想 
变成:蓝色理想 
aobert的正则: 
<script> 
var str=”蓝色理想” 
var reg=//s+/g 
str = str.replace(reg,” “) 
document.write(str) 
</script> 
 
判断字符串是不是由数字组成 
来源:有没有简单的方法判断字符串由数字组成? 
这个正则比较简单,写了一个测试 
<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)); 
</script> 
 
电话号码正则 
来源:想问一下关于电话号码的正则判断 
:求一个验证电话号码的JS正则 
/^/d{3,4}-/d{7,8}(-/d{3,4})?$/ 
区号必填为3-4位的数字,区号之后用“-”与电话号码连接 
^/d{3,4}- 
电话号码为7-8位的数字 
/d{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 = ‘13889294444’; 
var str2 = ‘12889293333’; 
var str3 = ‘23445567’; 
document.write(testReg(reg,str)+'<br />’); 
document.write(testReg(reg,str2)+'<br />’); 
document.write(testReg(reg,str3)+'<br />’); 
 
使用正则表达式实现删除字符串中的空格: 
来源:请问JS中有没有去掉空格的函数 
代码以及测试代码如下: 
<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 = ” 123456789 “;//前后各有一个空格。 
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后 
</script> 
测试的结果如下: 
length:11 
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*/ig; 
//匹配字符串开头的任意个单词字符 
str = str.replace(reg,’test’); 
document.write(str); 
</script> 
原帖的有点复杂,没太看明白。 
 
只匹配中文的正则表达式 
来源:关于上传的时候,只能选择中文名称的图片(是否可以用TOASCII方法呢?) 
前两天看的《JavaScript开发王》里恰好有中文的unicode范围,正则如下: 
/[/u4E00-/u9FA5/uf900-/ufa2d]/ 
写了一个简单的测试,会把所有的中文替换成“哦”。 
<script type=”text/javascript”> 
var str = “有中文?and English.”; 
var reg = /[/u4E00-/u9FA5/uf900-/ufa2d]/ig; 
str = str.replace(reg,’哦’); 
document.write(str); 
</script> 
 
返回字符串的中文字符个数 
来源:有没返回中文字符字节的函数! 
一般的字符长度对中文和英文都是不分别的如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.length; 

var str = “中文123”; 
document.write(str.length+'<br />’); 
document.write(cLength(str)); 
</script> 
结果: 
52 
中文两个,数字三个,正确。 
下面的测试也正确。 
var str = “中文123tets@#!#%$#[][{}”; 
document.write(str.length+'<br />’); 
document.write(cLength(str)); 
 
正则表达式取得匹配IP地址前三段 
来源:如何用正则取IP前3段 
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地址的方法:求检验MAC地址的正则表达例子 
 
匹配<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:/006.JPG 
c:tupian/006.jpg 
可能是直接在盘符根目录下,也可能在好几层目录下,要求替换到只剩文件名。 
xlez的正则如下: 
/[^////]*[////]+/g 
首先匹配非左右斜线字符0或多个,然后是左右斜线一个或者多个。形如“xxx/”或者“xxx/”或者“/”或 
者“/” 
函数以及测试代码: 
<script type=”text/javascript”> 
function getFileName(str){ 
var reg = /[^////]*[////]+/g; 
//xxx/或者是xxx/ 
str = str.replace(reg,”); 
return str; 

var str = “c://tupian//006.jpg”; 
document.write(getFileName(str)+'<br />’); 
var str2 = “c:tupian/test2.jpg”; 
document.write(getFileName(str2)); 
</script> 
注意,/需要转义。 
 
绝对路径变相对路径 
来源:讨论一个正则 
将<IMG height=”120″ width=”800″
src=” 
为:<IMG height=”120″ width=”800″ src=”/image/somepic.gif”>。 
其中网址可能改变,例如 
cloudchen的正则: 

首先是 
配。 
测试代码如下: 
<script type=”text/javascript”> 
var str = ‘<IMG height=”120″ width=”800″
src=” 
somepic.gif”>’; 
var reg = /; 
str = str.replace(reg,””); 
alert(str) 
</script> 
 
用户名正则 
来源:求正则,急急呀!! 
用于用户名注册,,用户名只能用中文、英文、数字、下划线、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 />’); 
</script> 
 
匹配英文地址 
来源:-求助- 正则问题 
规则如下: 
包含”点”,
“字母”,”空格”,”逗号”,”数字”,但开头和结尾不能是除字母外任何字符。 
[/.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 />’) 
</script> 
 
正则匹配价格 
来源:为什么这个正则不起作用啊?急啊? 
价格的格式应该如下: 
开头数字若干位,可能有一个小数点,小数点后面可以有两位数字。hansir给出的对应正则如下: 
/^(/d*/./d{0,2}|/d+).*$/ 
hansir给出的测试代码如下: 
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” 
“; 
<html xmlns=”; 
<head> 
<meta http-equiv=”Content-Type” c /> 
<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′); 


</script> 
</head> 
<body> 
<input type=”text” /> 
</body> 
</html> 
 
身份证号码的匹配 
来源:关于正则的,大家帮帮忙,急,在线等 
身份证号码可以是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 = ‘123456789012345’;//15位 
var str2 = ‘123456789012345678’;//18位 
var str3 = ‘12345678901234567X’;//最后一位是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 />’); 
</script> 
 
要求文本有指定行数 
来源:[求助]求一句正则表达式的写法 
匹配至少两行的字符串,每行都为非空字符。 
只要匹配到[/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 />’); 
</script> 
 
正则验证日期格式 
来源:YYYY-MM-DD的正则怎样写啊? 
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 = ‘2008-8-8’; 
var str2 = ‘2008-08-08’; 
var str3 = ’08-08-2008′; 
var str4 = ‘2008 08 08’; 
document.write(testReg(reg,str)+'<br />’); 
document.write(testReg(reg,str2)+'<br />’); 
document.write(testReg(reg,str3)+'<br />’); 
document.write(testReg(reg,str4)+'<br />’); 
</script> 
 
第二种格式:来源:求一正则表达式 
yyyy-mm-dd 
或 
yyyy/mm/dd 
用“或”简单地修改一下就行了。 
/^/d{4}(-|//)/d{1,2}(-|//)/d{1,2}$/ 
 
去掉文件的后缀名 
来源:求一个正则 
www.abc.com/dc/fda.asp变为www.abc.com/dc/fda。 
如果文件后缀已知的话这个问题就非常简单了,正则如下: 
//.asp$/ 
匹配最后的.asp而已,测试代码如下: 
<script type=”text/javascript”> 
function delAspExtension(str){ 
var reg = //.asp$/; 
return str.replace(reg,”); 

var str = ‘www.abc.com/dc/fda.asp’; 
document.write(delAspExtension(str)+'<br />’); 
</script> 
如果文件名未知的话就用这个正则://./w+$/,测试代码如下: 
<script type=”text/javascript”> 
function delExtension(str){ 
var reg = //./w+$/; 
return str.replace(reg,”); 

var str = ‘example.com/dc/fda.asp’; 
document.write(delExtension(str)+'<br />’); 
var str2 = ‘test/regular/fda.do’; 
document.write(delExtension(str2)+'<br />’); 
var str3 = ‘example.com/dc/fda.strange_extension’; 
document.write(delExtension(str3)+'<br />’); 
</script> 
 
验证邮箱的正则表达式 
来源:找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 = ‘test@hotmail.com’; 
document.write(isEmail(str)+'<br />’); 
var str2 = ‘test@sima.vip.com’; 
document.write(isEmail(str2)+'<br />’); 
var str3 = ‘te-st@qq.com.cn’; 
document.write(isEmail(str3)+'<br />’); 
var str4 = ‘te_st@sima.vip.com’; 
document.write(isEmail(str4)+'<br />’); 
var str5 = ‘te.._st@sima.vip.com’; 
document.write(isEmail(str5)+'<br />’); 
</script> 
我不太了解邮箱的具体规则。感觉这个正则比较简单,EMAIL校验正则讨论求解里有比较详细的邮 
箱正则讨论。 
 
匹配源代码中的链接 
来源:正则 
能够匹配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.length;i++){ 
//alert(arr); 
document.write(‘link:’+arr+'<br />’); 


var str = ‘<p>测试链接:<a id = “test”
href=”” title=”无敌”>经典 
论坛 
</a></p><a href = “”
>蓝色理想</a>’; 
var arr = findLinks(str); 
</script> 
会把所有的链接在页面直接显示出来。注意, 
本帖遗留问题:如何执行从右到左的匹配。貌似JS 或者VBS
没有提供这个功能2、JS 或 
者VBS 不支持后行断言。。用什么方法实现这个功能。
xyyy 2009-06-27 07:52
正则判断标签是否闭合 
来源:求助超难!正则表达式如何判断一个标签是否闭合 
例如:<img xxx=”xxx” 就是没有闭合的标签; 
<p>p的内容,同样也是没闭合的标签。 
从简单的正则开始,先匹配起始标签 
/<[a-z]+/i 
再加上若干属性: 
/<[a-z]+(/s*/w*?/s*=/s*”.+?”)*/i 
下面就到关键点了,标签的闭合。标签可能有两种方式闭合,<img xxx=”xxx”
/> 
或者是<p>xxx </p>。 
(/s*//>) 
匹配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 
用正则获得指定标签的内容 
来源:求一正则 
有如下代码: 
<channel> 
<title>蓝色理想</title> 
</channel> 
<item> 
<title>界面设计测试规范</title> 
</item> 
<item> 
<title>《古典写实美女》漫画教程</title> 
</item> 
<item> 
<title>安远――消失的光年</title> 
</item> 
<item> 
<title>asp.net 2.0多语言网站解决方案</title> 
</item> 
要求匹配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]+$/ig; 
return reg.test(str); 

var str = ‘AaBc’; 
var str2 = ‘aaa123’; 
var str3 = ‘123dd’; 
var str4 = ‘1230923403982’; 
document.write(istrue(str)+'<br />’); 
document.write(istrue(str2)+'<br />’); 
document.write(istrue(str3)+'<br />’); 
document.write(istrue(str4)+'<br />’); 
</script> 
结果为: 
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 = ‘1230923403982’; 
document.write(istrue(str)+'<br />’); 
document.write(istrue(str2)+'<br />’); 
document.write(istrue(str3)+'<br />’); 
document.write(istrue(str4)+'<br />’); 
</script> 
结果为 
false,true,true,false 
正确。
xyyy 2009-06-27 07:52
空格与英文同时存在 
来源:正则问题请指教啊! 
匹配英文以及空格,要求必须既有英文字母又有空格。 
这个思路和上面的差不多,只要把数字改成空格就可以了。正则如下: 
/^(([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 />’); 
</script> 
利用这个思路也可以实现英文空格英文,英文单词多于两个的匹配。同样,也可以把英文字母换成单词 
字符/w。 
显示或者保存正则表达式匹配的部分内容 
有如下电话号码: 
13588888333 
13658447322 
13558885354 
13587774654 
13854554786 
要求,要求只匹配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″); 
else 
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″); 
else 
return “不是135打头的手机号码!”; 

var arr = new Array( 
“13588888333”, 
“13658447322”, 
“13558885354”, 
“13587774654”, 
“13854554786” 
); 
for(var i = 0; i < arr.length; i++) 
document.write(f(arr)+'<br />’); 
</script> 
 
正则表达式替换变量 
来源:求教正则 
有一个数组: 
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+/$/ig; 
C=_B.replace(reg,function($1){ 
var indexnum=$1.replace(//$/ig,””); 
if (indexnum<_A.length) 
{return _A[indexnum];} 
else{return “”} 
}); 
alert(C); 
</script> 
代码分析:看到代码之后感觉有点晕,首先,正则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” border=”0″ 
><br> 
O’Malley’s West</td> 
要求将所有onclick属性中的’替换成/’,也就是将单引号转义。 
首先,需要匹配onclick属性: 
/onclick/s*=/s*”.+?”/ig 
然后再将所有的’都替换成/’就可以了。整个测试的代码如下: 
<script type=”text/javascript”> 
<!– 
function $(id) { 
return document.getElementById(id); 

function replace() { 
$(“txtDes”).value = $(“txtSrc”).value.replace(/onclick/s*=/s*”.+?”/ig,
function (m) { 
return m.replace(//’/g, “[url=file://]//'[/url]”); 
}); 

//–> 
</script> 
<textarea id=”txtSrc” rows=”15″ cols=”80″> 
<td align=”center”><img src=”../photo/ccg/thumbnails/O’Malley’s
West_jpg.gif” 
border=”0″ ><br> 
O’Malley’s West</td> 
<td align=”center”><img src=”../photo/lag/thumbnails/Coach’s
Bar & Grill_jpg.gif” 
border=”0″ ><br> 
Coach’s Bar & Grill</td> 
<td align=”center”><img src=”../photo/pnx/thumbnails/Betty’s
Burger (Hamburger 
Mary’s)_jpg.gif” border=”0″ ><br> 
Betty’s Burger (Hamburger Mary’s)</td> 
</textarea> 
<br/> 
<input type=”button” value=” replace ” /> 
<br/> 
<textarea id=”txtDes” rows=”15″ cols=”80″> 
</textarea> 
 
将阿拉伯数字替换为中文大写形式 
来源:正则问题 
将123替换成壹贰叁。 
只要匹配一个数字就可以了,测试代码如下(如果显示为乱码就调整一下浏览器的字符编码): 
function replaceReg(reg,str){ 
return str.replace(reg,function(m){return arr[m];}) 

arr=new Array(“零”,”壹”,”贰”,”叁”,”肆”,”伍”,”陆”,”柒”,”捌”,”玖”); 
var reg = //d/g; 
var str = ‘13889294444’; 
var str2 = ‘12889293333’; 
var str3 = ‘23445567’; 
document.write(replaceReg(reg,str)+'<br />’); 
document.write(replaceReg(reg,str2)+'<br />’); 
document.write(replaceReg(reg,str3)+'<br />’); 
 
替换文本中的URL为链接 
来源:求一链接替换正则 
将一个用户输入的一段文字中的url替换成可以点击的link地址。例如: 
以替换成 
或<a href=”.
blueidea.com</a>. 
这个正则的关键就在于匹配链接,匹配之后,在两边加上a标签和属性不是问题。 

首先匹配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 = /; 
var str =
‘将一个用户输入的一段文字中的url替换成可以点击的link地址。测试一 
下: is
very 
good!’; 
document.write(replaceReg(reg,str)+'<br />’); 
</script> 
 
从HTML代码段删除指定标签极其内容 
来源:关于正则的问题 
在一段代码中去除<script …… /script>,
<head>…</head>,<%…..%>等代码块 
隆的正则: 
/<(script|meta|%)[/s/S]*?//(script|meta|%)>/ 
试了一下,匹配如下文本正常: 
<script type=”text/javascript”> 
我是要被删除的脚本 
</script> 
哎。就剩下我了。 
但是,如果使用类似的正则: 
/<(script|head|%)[/s/S]*?//(script|head|%)>/ig 
匹配有嵌套的标签: 
<head> 
<script type=”text/javascript”> 
我是要被删除的脚本 
</script> 
</head> 
哎。就剩下我了。 
实际匹配的内容是: 
<head> 
<script type=”text/javascript”> 
我是要被删除的脚本 
</script> 
这是因为[/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/]/ig; 
var str = ‘[title]标题一[/title]内容一232323sdfga
[title]标题二[/title]内容二2232323 [title]标 
题三[/title]内容三2232323′; 
document.write(replaceReg(reg,str)+'<br />’); 
</script>
xyyy 2009-06-27 07:53
转换源代码中的标签 
来源:一个正则上的问题 
将代码中的HTML标签img转换为。 
/<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,”) 

var reg = 
/<img(?:/s*/w*?/s*=/s*”.+?”)*?/s*src/s*=/s*”(.+?)”(?:/s*/w*?/s*=/s*”.+?”)*/s*>/ 
ig; 
var str = ‘我就是传说中的图片了<img src=”URL”>哎。’; 
document.write(replaceReg(reg,str)+'<br />’); 
</script> 
第二个是替换object代码嵌入的flash代码替换为
点击播放flash
。 
针对原文的正则如下: 
/<object[/s/S]*?src=([/s/S]+?)(?=/s)[/s/S]*<//object>/i 
如果是所有的属性都有双引号的话正则也需要修改。 
测试如下: 
<script type=”text/javascript”> 
function replaceReg(reg,str){ 
return str.replace(reg,’
点击播放flash
‘) 

var reg =
/<object[/s/S]*?src=([/s/S]+?)(?=/s)[/s/S]*<//object>/i; 
var str = ‘<object
classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 
codebase= 
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= 
index.cgi?P1_Prod_Version=ShockwaveFlash
type=application/x-shockwave-flash 
width=255 height=250></embed></object>’; 
document.write(replaceReg(reg,str)+'<br />’); 
</script> 
给属性添加双引号 
来源:请教正则表达式高手 
给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> 
function rp(str,trg){ 
var reg1 =
/(/s+/w+)/s*=/s*([^<>”/s]+)(?=[^<>]*>)/ig 
var reg2 = /”‘([^'”]*)'”/ig; 
str=str.replace(reg1,’$1=”$2″‘).replace(reg2,’/”$1/”‘); 
trg.value=str; 

</script> 
<textarea id=”sou” style=”width:100%”> 
<a href = xxx name=aaa target=_blank title=’asdfasf’
onclick=alert(‘blueidea’)> 
asfd=asfd 
</textarea> 
<input type=”button” 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>就可以了。 
 
去掉标签的所有属性 
来源:正则表达式(DREAMWEAVER8) 
<td style=”width: 23px; height: 26px;”
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” 
“; 
<html xmlns=”; 
<head> 
<meta http-equiv=”Content-Type” c /> 
<META name=”Author” c /> 
<script type=”text/javascript”> 
function encode(s){ 
return
s.replace(/&/g,”&”).replace(/</g,”<“).replace(/>/g,”>”).replace(/ 
([///./*/[/]/(/)/$/^])/g,”[url=file://$1/]//$1[/url]”); 

function decode(s){ 
return
s.replace(///([///./*/[/]/(/)/$/^])/g,”$1″).replace(/>/g,”>”).replace(/</ 
g,”<“).replace(/&/g,”&”); 

function highlight(s){ 
if (s.length==0){ 
alert(‘搜索关键词未填写!’); 
return false; 

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); 
return cnt; 

for (var i=0,c;c=obj.childNodes;i++){ 
if (!c.className||c.className!=”highlight”) 
cnt+=loopSearch(s,c); 

return cnt; 

function replace(s,dest){ 
var r=new RegExp(s,”g”); 
var tm=null; 
var t=dest.nodeValue; 
var cnt=0; 
if (tm=t.match(r)){ 
cnt=tm.length; 
t=t.replace(r,”{searchHL}”+decode(s)+”{/searchHL}”) 
dest.nodeValue=t; 

return cnt; 

</script> 
<style type=”text/css”> 
.highlight{background:green;font-weight:bold;color:white;} 
</style> 
</head> 
<body> 
<form > 
<p><input name=”s” id=”s” title=”搜索内容:”/><input
type=”submit” value=”搜 
索”/></p> 
</form> 
<div id=”content”> 
测试高亮的代码。很长很长的代码…………………… 
</div> 
</body> 
</html> 
 
删除标签 
来源:如何使用正则表达式去除大部分HTML标记? 
删除除了<img>、<br>、<p>之外所有的标签。子虚乌有给出代码中关键的一句: 
o.innerHTML.replace(/(<//?(?!br|p|img)[^>//]*)//?>/gi,”); 
刚开始没反应过来,后来才想起来,这个正则不用区分起始和结束标签。 
<//?(?!br|p|img) 
匹配除了保护标签外标签的起始标签或者是结束标签的一部分。 
[^>//]* 
匹配到>或者/就结束。 
//?> 
起始标签或者结束标签的结尾

图片 1

本文介绍正则表达式的高级技巧。筛选出了八个常用的概念,并配上实例解析,每个例子都是满足某种复杂要求的简单写法。如果你对正则的基本概念尚缺乏了解,请先阅读这篇文章,或者这个教程,或者维基条目。

原文地址:

验证域名检验一个字符串是否是个有效域名

$url = "http://komunitasweb.com/"; 
if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url)) { 
  echo "Your url is ok."; 
} else { 
  echo "Wrong url."; 
}

这里的正则语法适用于php,与perl兼容。

从一个字符串中 突出某个单词

这是一个非常有用的在一个字符串中匹配出某个单词
并且突出它,非常有效的搜索结果

$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or 

regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor"; 
$text = preg_replace("/b(regex)b/i", '1', $text); 
echo $text;

突出查询结果在你的 WordPress
博客里就像刚才我说的,上面的那段代码可以很方便的搜索出结果,而这里是一个更好的方式去执行搜索在某个WordPress的博客上打开你的文件
search.php ,然后找到 方法 the_title() 然后用下面代码替换掉它

echo $title; 

Now, just before the modified line, add this code: 

<?php 
  $title   = get_the_title(); 
  $keys= explode(" ",$s); 
  $title   = preg_replace('/('.implode('|', $keys) .')/iu', 
    '<strong></strong>', 
    $title); 
?> 

Save the search.php file and open style.css. Append the following line to it: 

strong.search-excerpt { background: yellow; }

1. 贪婪/懒惰

从HTML文档中获得全部图片

如果你曾经希望去获得某个网页上的全部图片,这段代码就是你需要的,你可以轻松的建立一个图片下载机器人

$images = array(); 
preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media); 
unset($data); 
$data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]); 
foreach($data as $url) 
{ 
  $info = pathinfo($url); 
  if (isset($info['extension'])) 
  { 
    if (($info['extension'] == 'jpg') || 
    ($info['extension'] == 'jpeg') || 
    ($info['extension'] == 'gif') || 
    ($info['extension'] == 'png')) 
    array_push($images, $url); 
  } 
}

所有能多次限定的正则运算符都是贪婪的。他们尽可能多地匹配目标字符串,也就是说匹配结果会尽可能地长。不幸的是,这种做法并不总是我们想要的。因此,我们添加“懒惰”限定符来解决问题。在各个贪婪运算符后添加“?”能让表达式只匹配尽可能短的长度。另外,修改器“u”也能惰化能多次限定的运算符。理解贪婪与懒惰的区别是运用高级正则表达式的基础。

删除重复字母

经常重复输入字母? 这个表达式正适合.

$text = preg_replace("/s(w+s)1/i", "$1", $text);

贪婪操作符
操作符
匹配之前的表达式零次或零次以上。它是一个贪婪操作符。请看下面的例子:

删除重复的标点

功能同上,但只是面对标点,白白重复的逗号

$text = preg_replace("/.+/i", ".", $text);

复制代码 代码如下:

匹配一个XML或者HTML标签

这个简单的函数有两个参数:第一个是你要匹配的标签,第二个是包含XML或HTML的变量,再强调下,这个真的很强大

function get_tag( $tag, $xml ) { 
 $tag = preg_quote($tag); 
 preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}', 
          $xml, 
          $matches, 
          PREG_PATTERN_ORDER); 

 return $matches[1]; 
}

preg_match( ‘ /< h1> .< /h1> /’ ‘ < h1>
这是一个标题。< /h1>
< h1> 这是另一个。< /h1> ‘ $matches )

匹配具有属性值的XML或者HTML标签

这个功能和上面的非常相似,但是它允许你匹配的标签内部有属性值,例如你可以轻松匹配
<div id=”header”>

function get_tag( $attr, $value, $xml, $tag=null ) { 
 if( is_null($tag) ) 
  $tag = 'w+'; 
 else 
  $tag = preg_quote($tag); 

 $attr = preg_quote($attr); 
 $value = preg_quote($value); 

 $tag_regex = "/<(".$tag.")[^>]*$attrs*=s*". 
        "(['"])$value\2[^>]*>(.*?)</\1>/" 

 preg_match_all($tag_regex, 
         $xml, 
         $matches, 
         PREG_PATTERN_ORDER); 

 return $matches[3]; 
}

句点(.)能代表除换行符外的任意字符。上面的正则表达式匹配 h1
标签以及标签内的所有内容。它用句点(.)和星号()来匹配标签内的所有内容。匹配结果如下:

匹配十六进制颜色值

web开发者的另一个有趣的工具,它允许你匹配和验证十六进制颜色值.

$string = "#555555"; 
if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) { 
echo "example 6 successful."; 
}

1.< h1> 这是一个标题。< /h1> < h1> 这是另一个。<
/h1>
整个字串都被返回。 操作符会连续匹配所有内容—— 甚至包括中间的 h1
闭合标签。因为它是贪婪的,匹配整个字串是符合其利益最大化原则。

查找页面 title

这段代码方便查找和打印 网页 <title> 和</title> 之间的内容

$fp = fopen("http://www.catswhocode.com/blog","r"); 
while (!feof($fp) ){ 
  $page .= fgets($fp, 4096); 
} 

$titre = eregi("<title>(.*)</title>",$page,$regs); 
echo $regs[1]; 
fclose($fp);

懒惰操作符
把上面的式子稍作修改,加上一个问号(?),能让表达式变懒惰:

解释 Apache 日志

大多数网站使用的都是著名的Apache服务器,如果你的网站也是,那么使用PHP正则表达式解析
apache 服务器日志 怎么样?

//Logs: Apache web server 
//Successful hits to HTML files only. Useful for counting the number of page views. 
'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$' 

//Logs: Apache web server 
//404 errors only 
'^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$'

1./< h1> .?< /h1> /
这样它会觉得,只需匹配到第一个 h1 结尾标签就完成任务了。

使用智能引号代替双引号

如果你是一个印刷爱好者,你将喜欢这个允许用智能引号代替双引号的正则表达式,这个正则被WORDPRESS在其内容上使用

preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);

另一个有着类似属性的贪婪操作符是 {n }
。它代表之前的匹配模式重复n次或n次以上,如果没有加上问号,它会寻找尽可能多的重复次数,加上的话,则会尽可能少重复(当然也就是“重复n次”最少)。

检验密码的复杂度

这个正则表达式将检测输入的内容是否包含6个或更多字母,数字,下划线和连字符.
输入必须包含至少一个大写字母,一个小写字母和一个数字

'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'

复制代码 代码如下:

WordPress: 使用正则获得帖子上的图片

我知道很多人是WORDPRESS的使用者,你可能会喜欢并且愿意使用
那些从帖子的内容检索下来的图像代码。使用这个代码在你的BLOG只需要复制下面代码到你的某个文件里

<?php if (have_posts()) : ?> 
<?php while (have_posts()) : the_post(); ?> 

<?php 
$szPostContent = $post->post_content; 
$szSearchPattern = '~<img [^>]* />~'; 

// Run preg_match_all to grab all the images and save the results in $aPics 
preg_match_all( $szSearchPattern, $szPostContent, $aPics ); 

// Check to see if we have at least 1 image 
$iNumberOfPics = count($aPics[0]); 

if ( $iNumberOfPics > 0 ) { 
   // Now here you would do whatever you need to do with the images 
   // For this example the images are just displayed 
   for ( $i=0; $i < $iNumberOfPics ; $i++ ) { 
     echo $aPics[0][$i]; 
   }; 
}; 

endwhile; 
endif; 
?>

# 建立字串
$str = ‘ hihihi oops hi’
# 使用贪婪的{n }操作符进行匹配
preg_match( ‘ /(hi){2 }/’ $str $matches ) # matches[0] 将是 ‘
hihihi’
# 使用堕化了的 {n }? 操作符匹配
preg_match( ‘ /(hi){2 }?/’ $str $matches ) # matches[0] 将是 ‘
hihi’

自动生成笑脸图案

被WordPress使用的另一个方法, 这段代码可使你把图像自动更换一个笑脸符号

$texte='A text with a smiley '; 
echo str_replace(':-)','<img src="smileys/souriant.png">',$texte);
  1. 回返引用(back referencing)

移除图片的链接

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<?php 
  $str = ' 
    <a href="http://www.jobbole.com/">jobbole</a>其他字符 
    <a href="http://www.sohu.com/">sohu</a> 
    <a href="http://www.sohu.com/"><img src="http://www.fashion-press.net/img/news/3176/mot_06.jpg" /></a> 
    <br>'; 

  //echo preg_replace("/(<a.*?>)(<img.*?>)(</a>)/", '$2', $str);  
  echo preg_replace("/(<a.*?>)(<img.*?>)(</a>)/", '2', $str);  
?>

以上就是15个超实用的php正则表达式,希望对大家的学习有所帮助。

有什么用?
回返引用(back
referencing)一般被翻译成“反向引用”、“后向引用”、“向后引用”,个人觉得“回返引用”更为贴切[笨活儿]。它是在正则表达式内部引用之前捕获到的内容的方法。例如,下面这个简单例子的目的是匹配出引号内部的内容:

复制代码 代码如下:

# 建立匹配数组
$matches = array()

# 建立字串
$str = ” ” this is a ‘ string’ ” ”

# 用正则表达式捕捉内容
preg_match( ” /(” |’ ).?(” |’ )/” $str $matches )

# 输出整个匹配字串
echo $matches[0]

它会输出:

1.” this is a’
显然,这并不是我们想要的内容。

这个表达式从开头的双引号开始匹配,遭遇单引号之后就错误地结束了匹配。这是因为表达式里说:(”|’),也就是双引号(”)和单引号(‘)均可。要修正这个问题,你可以用到回返引用。表达式1
2 … 9
是对前面已捕获到的各个子内容的编组序号,能作为对这些编组的“指针”而被引用。在此例中,第一个被匹配的引号就由
1 代表。

如何运用? 将上面的例子中,后面的闭合引号替换为1:

1.preg_match( ‘ /(” |’ ).?1/’ $str $matches )
这会正确地返回字串:

1.” this is a ‘ string’ “
译注思考题:

如果是中文引号,前引号和后引号不是同一个字符,怎么办?

还记得php函数 preg_replace 吗?其中也有回返引用。只不过我们没有用 1 …
9,而是用了 $1 … $9 … $n
(此处任意数目均可)作为回返指针。例如,如果你想把所有的段落标签<
p> 都替换成文本:

复制代码 代码如下:

$text = preg_replace( ‘ /< p> (.?)< /p> /’
” & lt p& gt $1& lt /p& gt ” $html )

参数$1是一个回调引用,代表段落标签< p>
内部的文字,并插入到替换后的文本里。这种简便易用的表达式写法为我们提供了一个获取已匹配文字的简单方法,甚至在替换文本时也能使用。

  1. 已命名捕获组(named groups)
    当在一个表达式内多次用到回调引用时,很容易就把事情搞混淆,要弄清那些数字(1

    9)都代表哪一个子内容是件很麻烦的事。回调引用的一个替代方法是使用带名字的捕获组(下文简称“有名组”)。有名组使用(?p<
    name>
    pattern)来设定,name代表组名,pattern是配合该有名组的正则结构。请看下面的例子:

1./(?p< quote> ” |’ ).?(?p=quote)/
上式中,quote就是组名,”|’
的是匹配内容的正则。后面的(?p=quote)是在调用组名为quote的有名组。这个式子的效果和上面的回调引用实例一样,只不过是用了有名组来实现。是不是更加易读易懂了?

有名组也能用于处理已匹配内容之数组的内部数据。赋予特定正则的组名也能作为所匹配到的内容在数组内部的索引词。

复制代码 代码如下:

preg_match( ‘ /(?p< quote> ” |’ )/’ ” ‘ string’ ” $matches )

# 下面的语句输出“’ ”(不包括双引号)
echo $matches[1]

# 使用组名调用,也会输出“’ ”
echo $matches[‘ quote’ ]

所以,有名组并不只是让写代码更容易,它也能用于组织代码。

**4. 字词边界(word boundaries)

**字词边界是字串里的字词字符(包括字母、数字和下划线,自然也包括汉字)和非字词字符之间的位置。其特殊之处就在于,它并不匹配某个实在的字符。它的长度是零。
b 匹配所有字词边界。

不幸的是,字词边界一般都被忽视掉了,大部分人都没有在意他的现实意义。
例如,如果你想要匹配单词“import”:

1./import/
注意了!正则表达式有时候很调皮的。下面的字串也能和上面的式子匹配成功:

1.important
你或许觉得,只要在import前后加上空格,不就可以匹配这个独立的单词了:

1./ import /
那如果遇上这种情况呢:

1.the trader voted for the import
当 import
这个词在字串开头或者结尾时,修改后的表达式仍然不能用。因此,考虑各种情况是必须的:

1./(^import | import | import$)/i
别慌,还没完呢。如果遇到标点符号了呢?就为了满足这一个单词的匹配,你的正则可能就需要这样写:

1./(^import(:| | )? | import(:| | )? | import(.|?|!)?$)/i
对于只匹配一个单词来说,这样做实在是有点大动干戈了。正因如此,字词边界才显得意义重大。要适应上述要求,以及很多其他情况变种,有了字符边界,我们所需写的代码只是:

1./bimportb/
上面所有情况都得到了解决。 b
的灵活性就在于,它是一个没有长度的匹配。它只匹配两个实际字符之间想象出的位置。它检查两个相邻字符是否是一个为单字,另一个为非单字。情况符合,就返回匹配。如果遇到了单词的开头或结尾,
b 会把它当成是非单词字符对待。由于import里面的 i
仍然被看成是单词字符,import 就被匹配出来了。

注意,与b相对,我们还有
b,此操作符匹配两个单字或者两个非单字之间的位置。因此,如果你想匹配在某个单词内部的‘hi’,可以使用:

1.bhib
“this”、“hight”,都会返回匹配,而“hi there”则会返回不匹配。

5. 最小组团(atomic groups)
最小组团是无捕捉的特殊正则表达式分组。通常用来提高正则表达式的效能,也能用于消除特定匹配。一个最小组团可以用(?>
pattern) 来定义,其中pattern是匹配式。

1./(?> his|this)/
当正则引擎针对最小组团进行匹配时,它会跳过组团内标记的回溯位置。以单词“smashing”为例,当用上面的正则表达式匹配时,正则引擎会先尝
试在“smashing”里寻找“his”。显然,找不到任何匹配。此时,最小组团就发挥作用了:正则引擎会放弃所有回溯位置。也就是说,它不会尝试再从
“smashing”里查找“this”。为什么要这样设置?因为“his”都没有返回匹配结果,包含有“his”的“this”当然就更匹配不了了!

上面的例子并没有什么实用性,我们用/t?his?/
也能达到效果。再看看下面的例子:

1./b(engineer|engrave|end)b/
如果把“engineering”拿去匹配,正则引擎会先匹配到“engineer”,但接下来就遇到了字词边界,b,所以匹配不成功。然后,正则
引擎又会尝试在字串里寻找下一个匹配内容:engrave。匹配到eng的时候,后面的又对不上了,匹配失败。最后,尝试“end”,结果同样是失败。仔
细观察,你会发现,一旦engineer匹配失败,并且都抵达了字词边界,“engrave”和“end”这两个词就已经不可能匹配成功了。这两个词都比
engineer短小,正则引擎不应该再多做无谓的尝试。

1./b(?> engineer|engrave|end)b/
上面的替代写法更能节省正则引擎的匹配时间,提高代码的工作效率。

**6. 递归(recursion)

**递归(recursion)用于匹配嵌套结构,例如括弧嵌套, (this
(that)),html标签嵌套< div> < div> < /div> <
/div>
。我们使用(?r)来代表递归过程中的子模式。下面是一个匹配嵌套括弧的例子:

1./(((?> [^()]+)|(?r)))/
最外层使用了反义符的括号“(”匹配嵌套结构的开端。然后是一个多选项操作符( |
),可能匹配除括号外的所有字符 “(?>
[^()]+)”,也可能是通过子模式“(?r)”来再次匹配整个表达式。请注意,这个操作符会尽量多地匹配所有嵌套。

**递归的另一个实例如下:

**1./< ([w]+).?> ((?> [^< > ]+)|((?r)))< /1>
/
以上表达式综合运用了字符分组,贪婪操作符、回溯,以及最小化组团来匹配嵌套标签。第一个括弧内分组([w]+)匹配出标签名,用于接下来的应用。若找到这尖括号样式的标签,则尝试寻找标签内容的剩余部分。下一个括弧括起来的子表达式和上一个实例非常相似:要么匹配不包括尖括号的所有字符
(?> [^< >
]+),要么递归匹配整个表达式(?r)。整个表达式最后一部分就是尖括号样式的闭合标签<
/1> 。

**7. 回调(callbacks)

**匹配结果中的特定内容有时可能会需要某种特别的修改。要应用多重而复杂的修改,正则表达式的回调就有了用武之地。回调是用于函数preg_replace_callback中的动态修改字串的方式。你可以为preg_replace_callback指定某个函数为参数,此函数能接收匹配结果数组为参数,并将数组修改后返回,作为替换的结果。

例如,我们想将某字串中的字母全部转变成大写。十分不巧,php没有直接转化字母大小写的正则操作符。要完成这项任务,就可以用到正则回调。首先,表达式要匹配出所有需要被大写的字母:

1./bw/
上式同时使用了字词边界和字符类。光有这个式子还不够,我们还需要一个回调函数:

复制代码 代码如下:

function upper_case( $matches ) {
return strtoupper( $matches[0] )
}

函数upper_case接收匹配结果数组,并将整个匹配结果转化成大写。
在此例中,$matches[0]代表需要被大写化的字母。然后,我们再利用preg_replace_callback实现回调:

1.preg_replace_callback( ‘ /bw/’ ” upper_case” $str )
一个简单的回调即有这般强大的力量。

8. 注释(commenting)
注释不用来匹配字串,但确实是正则表达式中最重要的部分。当正则越写越深入,越写越复杂,要推译出究竟什么东西被匹配就会变得越来越困难。在正则表达式中间加上注释,是最小化将来的迷糊和困惑的最佳方式。

要在正则表达式内部加上注释,使用(?#comment)格式。把“comment”替换成你的注释语句:

1./(?#数字)d/
如果你打算把代码公之于众,为正则表达式加上注释就显得尤为重要。这样别人才能更容易看懂和修改你的代码。和其他场合的注释一样,这样做也能为你重访自己以前写的程序时提供方便。

考虑使用“x”或“(?x)”修改器来格式化注释。这个修改器让正则引擎忽略表达式参数之间的空格。“有用的”空格仍然能够通过[
]或(反义符加空格)来匹配。

复制代码 代码如下:

/
d #digit
[ ] #space
w+ #word
/x

上面的代码与下面的式子作用一样:

1./d(?#digit)[ ](?#space)w+(?#word)/
请时刻注意代码的可读性。

模式修正符
是为正则表达式增强和补充的一个功能,使用在正则之外
例子:/正则/U U就表示一个模式修正符
一下几个为php中常用的:(注意:区分大小写)
i 正则内容在匹配时候不区分大小写(默认是区分的)
m 在匹配首内容或者尾内容时候采用多行识别匹配
s 将转义回车取消是为单位匹配

x 忽略正则中的空白
A 强制从头开始匹配
D 强制$匹配尾部任何内容n
U
禁止贪mei匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序的正则表达式

您可能感兴趣的文章:

  • 正则表达式高级学习技巧
  • ASP正则表达式技巧
  • PHP
    正则表达式的几则使用技巧
  • 正则表达式高级技巧及实例详解
    笨活儿
  • javascript 正则表达式(二)
    使用技巧说明
  • 模板引擎正则表达式调试小技巧
  • .NET
    正则表达式使用高级技巧之替换类介绍
  • 正则表达式匹配不包含某些字符串的技巧
  • 写出高效率的正则表达式技巧总结

发表评论

电子邮件地址不会被公开。 必填项已用*标注