PHP中的正则表达式函数

在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation System interface)扩展库提供的。POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数。
两套函数库的功能相似,执行效率稍有不同。一般而言,实现相同的功能,使用PCRE库的效率略占优势。下面详细介绍其使用方法。
正则表达式的匹配
1.preg_match()
函数原型:int preg_match (string $pattern, string $content [, array $matches])
preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只作一次匹配,最终返回0或1的匹配结果数。代码6.1给出preg_match()函数的一段代码示例。
代码6.1  日期时间的匹配
<?php
//需要匹配的字符串。date函数返回当前时间
$content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together.";
//使用通常的方法匹配时间
if (preg_match ("/\d{4}-\d{2}-\d{2} \d{2}:\d{2} [ap]m/", $content, $m))
{
echo "匹配的时间是:" .$m[0]. "\n";
}
//由于时间的模式明显,也可以简单的匹配
if (preg_match ("/([\d-]{10}) ([\d:]{5} [ap]m)/", $content, $m))
{
echo "当前日期是:" .$m[1]. "\n";
echo "当前时间是:" .$m[2]. "\n";
}
?>
这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。
匹配的时间是:2006-08-17 01:25 pm
当前日期是:2006-08-17
当前时间是:01:25 pm
2.ereg()和eregi()
ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。
代码6.2  文件名的安全检验
<?php
$username = $_SERVER['REMOTE_USER'];
$filename = $_GET['file'];
//对文件名进行过滤,以保证系统安全
if (!ereg('^[^./][^/]*$', $userfile))
{
die('这不是一个非法的文件名!');
}
//对用户名进行过滤
if (!ereg('^[^./][^/]*$', $username))
{
die('这不是一个无效的用户名');
}
//通过安全过滤,拼合文件路径
$thefile = "/home/$username/$filename";
?>
通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数。
3.preg_grep()
函数原型:array preg_grep (string $pattern, array $input)
preg_grep()函数返回一个数组,其中包括了$input数组中与给定的$pattern模式相匹配的单元。对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。代码6.3给出的示例简单地说明了preg_grep()函数的使用。
代码6.3  数组查询匹配
<?php
$subjects = array(
"Mechanical Engineering",   "Medicine",
"Social Science",            "Agriculture",
"Commercial Science",                           "Politics"
);
//匹配所有仅由有一个单词组成的科目名
$alonewords = preg_grep("/^[a-z]*$/i", $subjects);
?>
6.3.2  进行全局正则表达式匹配
1.preg_match_all()
与preg_match()函数类似。如果使用了第三个参数,将把所有可能的匹配结果放入。本函数返回整个模式匹配的次数(可能为0),如果出错返回False。下面是一个将文本中的URL链接地址转换为HTML代码的示例。代码6.4是preg_match_all()函数的使用范例。
代码6.4  将文本中的链接地址转成HTML
<?php
//功能:将文本中的链接地址转成HTML
//输入:字符串
//输出:字符串
function url2html($text)
{
//匹配一个URL,直到出现空白为止
preg_match_all("/http:\/\/?[^\s]+/i", $text, $links);
//设置页面显示URL地址的长度
$max_size = 40;
foreach($links[0] as $link_url)
{
//计算URL的长度。如果超过$max_size的设置,则缩短。
$len = strlen($link_url);
if($len > $max_size)
{
$link_text = substr($link_url, 0, $max_size)."...";
} else {
$link_text = $link_url;
}
//生成HTML文字
$text = str_replace($link_url,"<a href='$link_url'>$link_text</a>",$text);
}
return $text;
}
//运行实例
$str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.taoboor.com”;
print url2html($str);
/*输出结果
这是一个包含多个URL链接地址的多行文字。欢迎访问<a href='http://www.taoboor.com'>
         http://www.taoboor.com</a>
*/
?&gt;
2.多行匹配
仅仅使用POSIX下的正则表式函数,很难进行复杂的匹配操作。例如,对整个文件(尤其是多行文本)进行匹配查找。使用ereg()对此进行操作的一个方法是分行处理。代码6.5的示例演示了ereg()如何将INI文件的参数赋值到数组之中。
代码6.5  文件内容的多行匹配
<?php
$rows = file('php.ini');  //将php.ini文件读到数组中
//循环遍历
foreach($rows as $line)
{
If(trim($line))
{
//将匹配成功的参数写入数组中
if(eregi("^([a-z0-9_.]*) *=(.*)", $line, $matches))
{
$options[$matches[1]] = trim($matches[2]);
}
unset($matches);
}
}
//输出参数结果
print_r($options);
?>
提示
这里只是为了方便说明问题。解析一个*.ini文件,最佳方法是使用函数parse_ini_file()。该函数直接将*.ini文件解析到一个大数组中。
6.3.3  正则表达式的替换
1.ereg_replace()和eregi_replace()
函数原型:string ereg_replace (string $pattern, string $replacement, string $string)
string eregi_replace (string $pattern, string $replacement, string $string)
ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换为$replacement。当$pattern中包含模式单元(或子模式)时,$replacement中形如“\1”或“$1”的位置将依次被这些子模式所匹配的内容替换。而“\0”或“$0”是指整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“\\0”,“\\1”的形式。
eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小写。代码6.6是本函数的应用实例,这段代码演示了如何对程序源代码做简单的清理工作。
代码6.6  源代码的清理
<?php
$lines = file('source.php');                                                                //将文件读入数组中
for($i=0; $i&lt;count($lines); $i++)
{
//将行末以“\\”或“#”开头的注释去掉
$lines[$i] = eregi_replace("(\/\/|#).*$", "", $lines[$i]);
//将行末的空白消除
$lines[$i] = eregi_replace("[ \n\r\t\v\f]*$", "\r\n", $lines[$i]);
}
//整理后输出到页面
echo htmlspecialchars(join("",$lines));
?>
2.preg_replace()
函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。
代码6.7  数组替换
<?php
//字符串
$string = "Name: {Name}&lt;br>\nEmail: {Email}<br>\nAddress: {Address}<br>\n";
//模式
$patterns =array(
"/{Address}/",
"/{Name}/",
"/{Email}/"
);
//替换字串
$replacements = array (
"No.5, Wilson St., New York, U.S.A",
"Thomas Ching",
"tom@emailaddress.com",
);
//输出模式替换结果
print preg_replace($patterns, $replacements, $string);
?&gt;
输出结果如下。
Name: Thomas Ching",
Email: tom@emailaddress.com
Address: No.5, Wilson St., New York, U.S.A
在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如:
<?php
$html_body = “&lt;HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”;
//输出结果中HTML标签将全部为小写字母
echo preg_replace (
"/(<\/?)(\w+)([^>]*&gt;)/e",
"'\\1'.strtolower('\\2').'\\3'",   //此处的模式变量\\2将被strtolower转换为小写字符
$html_body);
?&gt;
提示
preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。
6.3.4  正则表达式的拆分
1.split()和spliti()
函数原型:array split (string $pattern, string $string [, int $limit])
本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的忽略大小版本。代码6.8是一个经常用到关于日期的示例。
代码6.8  日期的拆分
<?php
$date = "08/30/2006";
//分隔符可以是斜线,点,或横线
list($month, $day, $year) = split ('[/.-]', $date);
//输出为另一种时间格式
echo "Month: $month; Day: $day; Year: $year&lt;br />\n";
?&gt;
2.preg_split()
本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。
代码6.9  查找文章中单词数量
<?php
$seek  = array();
$text   = "I have a dream that one day I can make it. So just do it, nothing is impossible!";
//将字符串按空白,标点符号拆分(每个标点后也可能跟有空格)
$words = preg_split("/[.,;!\s']\s*/", $text);
foreach($words as $val)
{
$seek[strtolower($val)] ++;
}
echo "共有大约" .count($words). "个单词。";
echo "其中共有" .$seek['i']. "个单词“I”。";
?>
提示
preg_split()函数使用了Perl兼容正则表达式语法,通常是比split()更快的替代方案。使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。

下面是一些讲解和例子,仅供大家参考和修改使用:

2.    "^\d+$"  //非负整数(正整数 + 0) 
3.    "^[0-9]*[1-9][0-9]*$"  //正整数 
4.    "^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 
5.    "^-[0-9]*[1-9][0-9]*$"  //负整数 
6.    "^-?\d+$"    //整数 
7.    "^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) 
8.    "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
9.    "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
10.    "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数
11.    "^(-?\d+)(\.\d+)?$"  //浮点数 
12.    "^[A-Za-z]+$"  //由26个英文字母组成的字符串 
13.    "^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
14.    "^[a-z]+$"  //由26个英文字母的小写组成的字符串 
15.    "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
16.    "^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
17.    "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
18.    "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url 
19.    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/   //  年-月-日
20.    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年
21.    "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"   //Emil
22.    /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/     //电话号码
23.    "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"   //IP地址
24.    
25.    匹配中文字符的正则表达式: [\u4e00-\u9fa5] 
26.    匹配双字节字符(包括汉字在内):[^\x00-\xff] 
27.    匹配空行的正则表达式:\n[\s| ]*\r 
28.    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
29.    匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
30.    匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
31.    匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
32.    匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
33.    匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
34.    匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 
35.    
36.    
37.    元字符及其在正则表达式上下文中的行为: 
38.    
39.    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 
40.    
41.    ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。 
42.    
43.    $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。 
44.    
45.    * 匹配前面的子表达式零次或多次。 
46.    
47.    + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 
48.    
49.    ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 
50.    
51.    {n} n 是一个非负整数,匹配确定的n 次。 
52.    
53.    {n,} n 是一个非负整数,至少匹配n 次。 
54.    
55.    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 
56.    
57.    ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。
58.    
59.    . 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。 
60.    (pattern) 匹配pattern 并获取这一匹配。 
61.    
62.    (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 
63.    
64.    (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
65.    
66.    (?!pattern) 负向预查,与(?=pattern)作用相反 
67.    
68.    x|y 匹配 x 或 y。 
69.    
70.    [xyz] 字符集合。 
71.    
72.    [^xyz] 负值字符集合。 
73.    
74.    [a-z] 字符范围,匹配指定范围内的任意字符。 
75.    
76.    [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。 
77.    
78.    \b 匹配一个单词边界,也就是指单词和空格间的位置。 
79.    
80.    \B 匹配非单词边界。 
81.    
82.    \cx 匹配由x指明的控制字符。 
83.    
84.    \d 匹配一个数字字符。等价于 [0-9]。 
85.    
86.    \D 匹配一个非数字字符。等价于 [^0-9]。 
87.    
88.    \f 匹配一个换页符。等价于 \x0c 和 \cL。 
89.    
90.    \n 匹配一个换行符。等价于 \x0a 和 \cJ。 
91.    
92.    \r 匹配一个回车符。等价于 \x0d 和 \cM。 
93.    
94.    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 
95.    
96.    \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 
97.    
98.    \t 匹配一个制表符。等价于 \x09 和 \cI。 
99.    
100.    \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 
101.    
102.    \w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 
103.    
104.    \W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 
105.    
106.    \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 
107.    
108.    \num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 
109.    
110.    \n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
111.    
112.    \nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
113.    
114.    \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 
115.    
116.    \un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。 
117.    
118.    匹配中文字符的正则表达式: [u4e00-u9fa5] 
119.    
120.    匹配双字节字符(包括汉字在内):[^x00-xff] 
121.    
122.    匹配空行的正则表达式:n[s| ]*r 
123.    
124.    匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/ 
125.    
126.    匹配首尾空格的正则表达式:(^s*)|(s*$) 
127.    
128.    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 
129.    
130.    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 
131.    
132.    利用正则表达式限制网页表单里的文本框输入内容: 
133.    
134.    用正则表达式限制只能输入中文:οnkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
135.    
136.    用正则表达式限制只能输入全角字符: οnkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
137.    
138.    用正则表达式限制只能输入数字:οnkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
139.    
140.    用正则表达式限制只能输入数字和英文:οnkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
141.    
142.    =========常用正则式 
143.    
144.    
145.    
146.    匹配中文字符的正则表达式: [\u4e00-\u9fa5] 
147.    
148.    匹配双字节字符(包括汉字在内):[^\x00-\xff] 
149.    
150.    匹配空行的正则表达式:\n[\s| ]*\r 
151.    
152.    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
153.    
154.    匹配首尾空格的正则表达式:(^\s*)|(\s*$) 
155.    
156.    匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g // 
157.    
158.    匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
159.    
160.    匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 
161.    
162.    sql语句:^(select|drop|delete|create|update|insert).*$ 
163.    
164.    1、非负整数:^\d+$ 
165.    
166.    2、正整数:^[0-9]*[1-9][0-9]*$ 
167.    
168.    3、非正整数:^((-\d+)|(0+))$ 
169.    
170.    4、负整数:^-[0-9]*[1-9][0-9]*$ 
171.    
172.    5、整数:^-?\d+$ 
173.    
174.    6、非负浮点数:^\d+(\.\d+)?$ 
175.    
176.    7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
177.    
178.    8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$ 
179.    
180.    9、负浮点数:^(-((正浮点数正则式)))$ 
181.    
182.    10、英文字符串:^[A-Za-z]+$ 
183.    
184.    11、英文大写串:^[A-Z]+$ 
185.    
186.    12、英文小写串:^[a-z]+$ 
187.    
188.    13、英文字符数字串:^[A-Za-z0-9]+$ 
189.    
190.    14、英数字加下划线串:^\w+$ 
191.    
192.    15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ 
193.    
194.    16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$ 
195.    或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$
196.    
197.    17、邮政编码:^[1-9]\d{5}$ 
198.    
199.    18、中文:^[\u0391-\uFFE5]+$ 
200.    
201.    19、电话号码:^((\d2,3\d2,3)|(\d{3}\-))?(0\d2,30\d2,3|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$
202.    
203.    20、手机号码:^((\d2,3\d2,3)|(\d{3}\-))?13\d{9}$ 
204.    
205.    21、双字节字符(包括汉字在内):^\x00-\xff 
206.    
207.    22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数) 
208.    
209.    23、匹配HTML标记:<(.*)>.*<\/\1>|<(.*) \/> 
210.    
211.    24、匹配空行:\n[\s| ]*\r 
212.    
213.    25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)? 
214.    
215.    26、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
216.    
217.    27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)? 
218.    
219.    28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+) 
220.    
221.    29、提取信息中的中国手机号码:(86)*0*13\d{9} 
222.    
223.    30、提取信息中的中国固定电话号码:(\d3,4\d3,4|\d{3,4}-|\s)?\d{8} 
224.    
225.    31、提取信息中的中国电话号码(包括移动和固定电话):(\d3,4\d3,4|\d{3,4}-|\s)?\d{7,14} 
226.    
227.    32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5} 
228.    
229.    33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+ 
230.    
231.    34、提取信息中的任何数字 :(-?\d*)(\.\d+)? 
232.    
233.    35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+) 
234.    
235.    36、电话区号:/^0\d{2,3}$/ 
236.    
237.    37、腾讯QQ号:^[1-9]*[1-9][0-9]*$ 
238.    
239.    38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
240.

241.    39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$

js正则函数match、exec、test、search、replace、split使用介绍集合

js:    pattern = /\-+.*/

pattern.test(’你的字符‘)        返回bool值

pattern.exec('你的字符')       返回数组

str.replace(param1,param2)     注意这里的param1可以是直接的字符也可以是正则表达式,   param2是你要替换成的字符        一定要注意是有返回值的你的最终替换结    果是返回值

以下为一些方法的详细介绍:

match 方法 
使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。 
stringObj.match(rgExp) 
参数 
stringObj 
必选项。对其进行查找的 String 对象或字符串文字。 
rgExp 
必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。 
其余说明与exec一样,不同的是如果match的表达式匹配了全局标记g将出现所有匹配项,而不用循环,但所有匹配中不会包含子匹配项。 
例子1: 
function MatchDemo(){ var r, re; // 声明变量。 var s = "The rain in Spain falls mainly in the plain"; re = /(a)in/ig; // 创建正则表达式模式。 r = s.match(re); // 尝试去匹配搜索字符串。 document.write(r); // 返回的数组包含了所有 "ain" 出现的四个匹配,r[0]、r[1]、r[2]、r[3]。 // 但没有子匹配项a。}输出结果:ain,ain,ain,ain

exec 方法

用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null。 
rgExp.exec(str) 
参数 
rgExp 
必选项。包含正则表达式模式和可用标志的正则表达式对象。 
str 
必选项。要在其中执行查找的 String 对象或字符串文字。 
返回数组包含: 
input:整个被查找的字符串的值; 
index:匹配结果所在的位置(位); 
lastInput:下一次匹配结果的位置; 
arr:结果值,arr[0]全匹配结果,arr[1,2...]为表达式内()的子匹配,由左至右为1,2...。 
例子2:

代码如下:

function RegExpTest(){ 
var src="http://sumsung753.blog.163.com/blog/I love you!"; 
var re = /\w+/g; // 注意g将全文匹配,不加将永远只返回第一个匹配。 
var arr; 
while((arr = re.exec(src)) !=null){ //exec使arr返回匹配的第一个,while循环一次将使re在g作用寻找下一个匹配。 
document.write(arr.index + "-" + arr.lastIndex + ":" + arr + "<br/>"); 
for(key in arr){ 
document.write(key + "=>" + arr[key] + "<br/>"); 

document.write("<br/>"); 


window.onload = RegExpTest(); 

输出结果: 
0-1:I //0为index,i所在位置,1为下一个匹配所在位置 
input=>I love you! 
index=>0 
lastIndex=>1 
0=>I 
2-6:love 
input=>I love you! 
index=>2 
lastIndex=>6 
0=>love 
7-10:you 
input=>I love you! 
index=>7 
lastIndex=>10 
0=>you 
说明:根据手册,exec只返回匹配结果的第一个值,比如上例如果不用while循环,将只返回'I'(尽管i空格后的love和you都符合表达式),无论re表达式用不用全局标记g。但是如果为正则表达式设置了全局标记g,exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志,exec 忽略 lastIndex 的值,从字符串的起始位置开始搜索。利用这个特点可以反复调用exec遍历所有匹配,等价于match具有g标志。
当然,如果正则表达式忘记用g,而又用循环(比如:while、for等),exec将每次都循环第一个,造成死循环。 
exec的输出将包含子匹配项。 
例子3:

代码如下:

function execDemo(){ 
var r, re; // 声明变量。 
var s = "The rain in Spain falls mainly in the plain"; 
re = /[\w]*(ai)n/ig; 
r = re.exec(s); 
document.write(r + "<br/>"); 
for(key in r){ 
document.write(key + "-" + r[key] + "<br/>"); 


window.onload = execDemo(); 

输出: 
rain,ai 
input-The rain in Spain falls mainly in the plain 
index-4 
lastIndex-8 
0-rain 
1-ai

test 方法

返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。 
rgexp.test(str) 
参数 
rgexp 
必选项。包含正则表达式模式或可用标志的正则表达式对象。 
str 
必选项。要在其上测试查找的字符串。 
说明 
test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。 
例子4:

代码如下:

function TestDemo(re, s){ 
var s1; 
if (re.test(s)) 
s1 = " 匹配正则式 "; 
else 
s1 = " 不匹配正则式 "; 
return("'" + s + "'" + s1 + "'"+ re.source + "'"); 

window.onload = document.write(TestDemo(/ab/,'cdef')); 

输出结果:'cdef' 不匹配正则式 'ab' 
注意:test()继承正则表达式的lastIndex属性,表达式在匹配全局标志g的时候须注意。 
例子5:

代码如下:

function testDemo(){ 
var r, re; // 声明变量。 
var s = "I"; 
re = /I/ig; // 创建正则表达式模式。 
document.write(re.test(s) + "<br/>"); // 返回 Boolean 结果。 
document.write(re.test(s) + "<br/>"); 
document.write(re.test(s)); 

testDemo(); 

输出结果: 
true 
false 
true 
当第二次调用test()的时候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。下例显示test的lastIndex属性:
例子6:

代码如下:

function testDemo(){ 
var r, re; // 声明变量。 
var s = "I"; 
re = /I/ig; // 创建正则表达式模式。 
document.write(re.test(s) + "<br/>"); // 返回 Boolean 结果。 
document.write(re.lastIndex); // 返回 Boolean 结果。 

testDemo(); 

输出: 
true 

解决方法:将test()的lastIndex属性每次重新指向0,re.lastIndex = 0;

search 方法

返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。 
stringObj.search(rgExp) 
参数 
stringObj 
必选项。要在其上进行查找的 String 对象或字符串文字。 
rgExp 
必选项。包含正则表达式模式和可用标志的正则表达式对象。 
说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。 
例子6:

代码如下:

function SearchDemo(){ 
var r, re; // 声明变量。 
var s = "The rain in Spain falls mainly in the plain."; 
re = /falls/i; // 创建正则表达式模式。 
re2 = /tom/i; 
r = s.search(re); // 查找字符串。 
r2 = s.search(re2); 
return("r:" + r + ";r2:" + r2); // 返回 Boolean 结果。 

document.write(SearchDemo()); 

输出:r:18;r2:-1

replace 方法 
返回根据正则表达式进行文字替换后的字符串的复制。 
stringObj.replace(rgExp, replaceText) 
参数 
stringObj 
必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。 
rgExp 
必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。
replaceText 
必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。
说明 
replace 方法的结果是一个完成了指定替换的 stringObj 对象的复制。意思为匹配的项进行指定替换,其它不变作为StringObj的原样返回。 
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。函数作参可以进行更为复杂的操作。
例子7:

代码如下:

function f2c(s) { 
var test = /(\d+(\.\d*)?)F\b/g; // 说明华氏温度可能模式有:123F或123.4F。注意,这里用了g模式 
return(s.replace 
(test, 
function(Regstr,$1,$2,$3,newstrObj) { 
return(("<br/>" + Regstr +"<br/>" + ($1-32) * 1/2) + "C" +"<br/>" + //以下两行进行替换 
$2 +"<br/>" + $3 +"<br/>" + newstrObj +"<br/>" ); 


); 

document.write(f2c("Water: 32.2F and Oil: 20.30F.")); 

输出结果: 
Water: //不与正则匹配的字符,按原字符输出 
32.2F //与正则相匹配的第一个字符串的原字符串 Regstr 
0.10000000000000142C //与正则相匹配的第一个字符串的第一个子模式匹配的替换结果 $1 
.2 //与正则相匹配的第一个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换 $2 
7 //与正则相匹配的第一个字符串的第一个子匹配出现的偏移量 $3 
Water: 32.2F and Oil: 20.30F. //原字符串 newstrObj 
and Oil: //不与正则匹配的字符 
20.30F //与正则相匹配的第二个字符串的原字符串 
-5.85C //与正则相匹配的第二个字符串的第一个子模式与匹配的替换结果 
.30 //与正则相匹配的第二个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换 
22 //与正则相匹配的第二个字符串的第一个子匹配出现的偏移量 
Water: 32.2F and Oil: 20.30F. //原字符串 
. //不与正则匹配的字符 
上面的函数参数我们全部用到了。在实际中,我们只须用将xxF替换为xxC,根据要求,我们无须写这么多参数。 
例子8:

代码如下:

function f2c(s) { 
var test = /(\d+(\.\d*)?)F\b/g; // 说明华氏温度可能模式有:123F或123.4F 
return(s.replace 
(test, 
function(strObj,$1) { 
return((($1-32) * 1/2) + "C"); 


); 

document.write(f2c("Water: 32.2F and Oil: 20.30F.")); 

输出:Water: 0.10000000000000142C and Oil: -5.85C. 
更多的应用: 
例子9:

代码如下:

function f2c(s) { 
var test = /([\d]{4})-([\d]{1,2})-([\d]{1,2})/; 
return(s.replace 
(test, 
function($0,$1,$2,$3) { 
return($2 +"/" + $1); 


); 

document.write(f2c("today: 2011-03-29")); 

输出:today: 03/2011

split 方法 
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 
stringObj.split([separator[, limit]]) 
参数 
stringObj 
必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。 
separator 
可选项。字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。 
limit 
可选项。该值用来限制返回数组中的元素个数。 
说明 
split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator 不作为任何数组元素的部分返回。
例子10:

代码如下:

function SplitDemo(){ 
var s, ss; 
var s = "The rain in Spain falls mainly in the plain."; 
// 正则表达式,用不分大不写的s进行分隔。 
ss = s.split(/s/i); 
return(ss); 

document.write(SplitDemo()); 

输出:The rain in ,pain fall, mainly in the plain.

js正则表达式之exec()方法、match()方法以及search()方法

先看代码:

var sToMatch = "test, Tes, tst, tset, Test, Tesyt, sTes";
var reEs = /es/gi;
alert(reEs.exec(sToMatch));
alert(sToMatch.match(reEs));
alert(sToMatch.search(reEs));

三个弹出框内容如下:

结果分析如下:

1、RegExp的exec()方法,有一个字符串参数,返回一个数组,数组的第一个条目是第一个匹配;其他的是反向引用。所以第一个返回的结果是第一个匹配的值es(不区分大小写)。

2、String对象有一个match()方法,它返回一个包含在字符串中所有匹配的数据。这个方法调用string对象,同时传给它一个RegExp对象。所以第二个弹出语句返回的是所有符合正则表达式的数组。

3、search()的字符串方法与indexOf()有些类似,但是它使用一个RegExp对象而非仅仅一个子字符串。search()方法返回第一个匹配值的位置。所以第三处弹出的是“1”,即第二个字符就匹配了。注意的是search()方法不支持全局匹配正规表达式(带参数g)。

转载于:https://www.cnblogs.com/alexguoyihao/p/9145185.html

php正则 与 js正则相关推荐

  1. html正则半角,JS正则密码校验之:JS正则匹配半角英文符号

    概述 在JS密码重网有剑据些文页的底社按标近新站的不的方校验中常常会遇到密码强度的校验需求,借用一位朋友提问的图,他在工作中遇到的一个比较经典的密码强度校验要和第,.年过事工宗据指数遍互业经搞断果会击 ...

  2. js正则验证特殊字符

    js正则验证特殊字符 方案一 var regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,regCn = /[·!#¥(--)::& ...

  3. js 正则之检测素数

    原文:js 正则之检测素数 相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题. 原文<检查素数的正则表达式>,在文章里已经解释了他是怎么判断的 ...

  4. js正则验证手机号码有效性

    通过js正则验证手机号码的有效性,方法如下: 验证130-139,150-159,180-189号码段的手机号码 <script type="text/javascript" ...

  5. js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g)...

    js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g) 一.总结 方括号:范围 圆括号:选 大括号:数量 1.js正则是在双正斜杠之中: var reg2=/[a-z]/ ...

  6. js 正则学习小记之匹配字符串

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  7. js 正则学习小记之左最长规则

    js 正则学习小记之左最长规则 原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'n ...

  8. js正则相关知识点专题

    1.JS正则表达式一条龙讲解(从原理和语法到JS正则)  //www.jb51.net/article/110516.htm 2.教你轻松记住JS正则表达式 //www.jb51.net/articl ...

  9. html正则表达式识别网址,JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)...

    本文实例讲述了JS正则匹配URL网址的方法.分享给大家供大家参考,具体如下: 最强的匹配网址-url的正则表达式:匹配www,http开头的一切网址 直接插入正则表达式: [a-zA-Z0-9][-a ...

最新文章

  1. 360°透视:云原生架构及设计原则
  2. 即将开源 | 2亿用户背后的Flutter应用框架Fish Redux
  3. python项目实战:获取本机所有IP地址的方法
  4. 使用应用编排服务一键式部署,持续集成利器--jenkins
  5. 华为VLAN间互访配置
  6. Unity3dRPG 相机跟随player旋转_跟随式灌装机
  7. java 有意思面试题_一些JAVA中有趣的面试题
  8. 使用python中正则表达式匹配linux ifconifg命令中的具体信息
  9. JSP教程第1讲笔记
  10. 【线性分类器】线性分类器理论知识
  11. cad 打开硬件加速卡_如何让CAD运行速度加快?
  12. java date计算年龄_Java中使用LocalDate根据日期来计算年龄
  13. VIM 参考手册 For Vim version 7.3
  14. 电阻-横向评测(转载)
  15. 四轮驱动(SSMR)移动机器人手柄控制
  16. DeleteObject()的使用
  17. oracle第五章多表连接习题答案(理解+剖析)
  18. 触摸屏GT9xx移植
  19. 技术,管理,和境界问题
  20. 小小总结—— 数字删除

热门文章

  1. C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别
  2. windows + vscode 远程配置
  3. C++操作符的优先级 及其记忆方法
  4. 什么是机器学习:一次权威定义之旅
  5. matlab inpainting,MATLAB-Python-inpainting-codes-master
  6. Redis的设计与实现之对象
  7. 关于map的下标操作的2个例子
  8. 0x84bb0001 sqlserver_sqlserver 实现收缩数据库日志操作
  9. nasm汇编:段的申明、$$、$
  10. 编译原理笔记 - 文法知识