正则表达式学习笔记

来源:互联网 发布:淘宝怎么添加菜鸟驿站 编辑:程序博客网 时间:2024/05/15 00:22

一、基本符号
^  "^wan" : 匹配以 wan 开始的字符串;
$  "wan$" : 匹配以 wan 结束的字符串;
   "^wan$" : 实际只匹配 wan 字符串;
  
* + ?
他们用来表示一个字符可以出现的次数或者顺序,他们分别表示:
"zero or more"  相当于{0,}
"one or more"  相当于{1,}
"zero or one" 相当于{0,1}
实例
"ab*" :和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等);
"ab+" :和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab" "abbb"等);
"ab?" :和ab{0,1}同义,可以没有或者只有一个b;
"a?b+$" :匹配以一个或者0个a再加上一个以上的b结尾的字符串。
"a(bc)*" : 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}" : 一个到5个 "bc";
注:(只管它前面那个字符)

| 相当于OR
"wan|woo": 匹配含有"wan" 或者 "woo" 的 字符串;
"(wan|woo)abc": 匹配含有 "wanabc" 或者 "wooabc"的字符串;
"(a|b)*c":  匹配含有这样多个(包括0个)a或b,后面跟一个c的字符串;

s 空格

. 所有的单一字符
"wan.[0-9]" : 一个wan加一个字符再加一个0到9的数字;
"^.{3}$" : 三个任意字符结尾;

[] 括号里的内容只匹配一个单一的字符
"[ab]" : 匹配单个的 a 或者 b (和 "a│b" 一样);
"[a-d]" : 匹配 a 到 d 的单个字符 (和"a│b│c│d" 还有 "[abcd]" 效果一样);

/s :用于匹配单个空格符,包括tab键和换行符;
/S :用于匹配除单个空格符之外的所有字符;
/d :用于匹配从0到9的数字;
/w :用于匹配字母,数字或下划线字符;
/W :用于匹配所有与/w不匹配的字符;


二、常用到的正则
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

匹配国内电话号码:/d{3}-/d{8}|/d{4}-/d{7}
如: 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]/d{5}(?!/d)
注:中国邮政编码为6位数字

匹配身份证:/d{15}|/d{18}
注:中国的身份证为15位或18位

匹配特定数字:
^[1-9]/d*$    //匹配正整数
^-[1-9]/d*$   //匹配负整数
^-?[1-9]/d*$   //匹配整数
^[1-9]/d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]/d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]/d*/./d*|0/./d*[1-9]/d*$   //匹配正浮点数
^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$  //匹配负浮点数
^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0)$  //匹配浮点数
^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^/w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

/*
eregi() -- 以不区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配的子串。
如果找到与 pattern 中圆括号内的子模式相匹配的子串并且函数调用给出了第三个参数 regs,则匹配项将被存入 regs 数组中。$regs[1] 包含第一个左圆括号开始的子串,$regs[2] 包含第二个子串,以此类推。$regs[0] 包含整个匹配的字符串。
*/
$title = "Replacement Canon BP-511 Camcorder Battery [Item ID:3-236-523]";
if(eregi("(/[Item ID:)([0-9]+)-([0-9]+)-([0-9]+)(])",$title,$arr)) {
    print_r($arr);
}

/*Array
(
    [0] => [Item ID:3-236-523]
    [1] => [Item ID:
    [2] => 3
    [3] => 236
    [4] => 523
    [5] => ]
)*/

ereg() --同eregi() 区分大小写
$date = "2009-12-23";
if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {
    echo "$regs[1]年$regs[2]月$regs[3]日<br/>/n";
} else {
    echo "Invalid date format: $date";
}


/*
split -- 用正则表达式将字符串分割到数组中
array split ( string $pattern, string $string [, int $limit] )
*/
// 分隔符可以是斜线,点,或横线
$date = "04/30/1973";
list($month, $day, $year) = split('[/.-]', $date);
echo "Month: $month; Day: $day; Year: $year<br/>/n";


/*
preg_match — 进行正则表达式匹配
int preg_match ( string $pattern, string $subject [, array $matches [, int $flags]] )
在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。
如果提供了 matches,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
*/
preg_match("/^(http:////)?([^//]+)/i", "http://www.php.net/index.html", $matches);
//以0个或1个 http// 开头的,以非 / 的1个或多的任意字符
$host = $matches[2];  //www.php.net

//从主机名中取得后面两段
preg_match("/[^/.//]+/.[^/.//]+$/", $host, $matches);
echo "domain name is: {$matches[0]}<br/>/n";
//本例执行后将输出: domain name is: php.net


//去掉 javascript 和 HTML 标记
$document = "AAAAAAAAAAAAA<script>alert('abc');</script><b>BBBBBBBBB</b>CCCCCCCCCC";
$search = array("'<script[^>]*?>.*?</script>'si", "'<[///!]*?[^<>]*?>'si");
$replace = array("", "");
$text = preg_replace($search, $replace, $document);
print_r($text);//AAAAAAAAAAAAABBBBBBBBBCCCCCCCCCC
echo '<br/>';


//提取URL
$content = "程序员人生 http://www.programmer.com 努力中。。。。";
$pattern = "/(https{0,1}:////[a-zA-Z0-9_/-]+/.[a-zA-Z0-9_/-/./%/?/=///&/,/;/*/}/#/|/:/@/+/{/~/+#]+)/";
preg_match_all($pattern, $content, $matches);
print_r($matches);
//Array ([0] => Array ([0] => http://www.programmer.com ) [1] => Array([0] => http://www.programmer.com))


//提取 src="***" 中的链接以及<embed></embed>外面的字符串
$str = "asdfasdfasdf<embed src='http://www.xiami.com/widget/0_1769251157/singlePlayer.swf?asAAAAAAAAAAAAA' target='_blank' rel='nofollow' title='http://www.xiami.com/widget/0_1769251157/singlePlayer.swf'>www.xiami.com/widget...</a>' type='application/x-shockwave-flash' width='257' height='33' wmode='transparent'></embed>asdfasdfasdfasdf";
if (strpos($str, 'embed')) {
    preg_match_all("/(.*?)/s*/<embed.*?src=(['|'])?(.*?)(['|'])?/s+.*?><//embed>(.*)$/", $str, $url);   
    echo $str = $url[1][0].' '.$url[3][0].' '.$url[5][0];
}

原创粉丝点击