一、基本符号
^ "^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];
}