基础概念
正则表达式是通过一系列符合某个规则的字符串来匹配要搜索的内容。正则表达式有三
种用法:
1.匹配:从某个字符串抽取信息;
2.替换:新文本替换匹配的旧文本;
3.分组:把字符串拆分成小块字符串的数组
匹配规则
使用 preg_match 函数可以实现对正则表达式的匹配能力。
//第一个参数是正则模式,第二个参数是需要匹配的字符串
$flag = preg_match(‘/ycku/‘, ‘ycku‘);
//匹配成功返回 1,否则返回 0
echo $flag
正则量词
//匹配的字符串至少包含一个 c,ycku 和 ycccku 都能匹配
echo preg_match(‘/yc+ku/‘, ‘ycku‘);
//匹配的字符串至少包含零个、一个或多个,yku、ycku 和 ycccku 都能匹配
echo preg_match(‘/yc*ku/‘, ‘ycku‘);
//匹配的字符串至少包含零个或一个,yku 和 ycku 都能匹配
echo preg_match(‘/yc?ku/‘, ‘ycku‘);
//匹配的字符串可以是任意一个字符,abcd 等都能匹配
echo preg_match(‘/y.ku/‘, ‘ycku‘);
//匹配的字符串可以是任意一个或多个字符
echo preg_match(‘/y.+ku/‘, ‘ycku‘);
//匹配的字符串必须两位
echo preg_match(‘/yc{2}ku/‘, ‘yccku‘);
//匹配的字符串必须 2-4 位之间
echo preg_match(‘/yc{2,4}ku/‘, ‘ycccku‘);
//匹配的字符串必须两位以上
echo preg_match(‘/yc{2,}ku/‘, ‘ycccccku‘);
//匹配的字符串必须从头部和尾部开始匹配
echo preg_match(‘/^sf$/‘, ‘www.dsf.com‘);
//匹配左边或匹配右边
echo preg_match(‘/ycku|sa/‘, ‘safd‘);
//分组匹配,可以数组输出
preg_match(‘/(y)(c)(k)(u)/‘, ‘ycku‘, $matches);
print_r($matches)
元字符
//匹配 a-z 中的其中一个字符
echo preg_match(‘/[a-z]/‘, ‘a‘);
//匹配 A-Z 中的其中一个字符
echo preg_match(‘/[A-Z]/‘, ‘A‘);
//匹配 0-9 中的其中一个字符
echo preg_match(‘/[0-9]/‘, ‘1‘);
//匹配 abc 中其中一个
echo preg_match(‘/[abc]/‘, ‘a‘);
//匹配不包含 abc 中任意一个
echo preg_match(‘/[^abc]/‘, ‘d‘);
//匹配 a-z、A-Z、0-9 和_
echo preg_match(‘/[a-zA-Z0-9_]/‘, ‘a‘);
//匹配 a-z、A-Z、0-9 和_
echo preg_match(‘/\w/‘, ‘a‘);
//匹配非 a-z、A-Z、0-9 和_
echo preg_match(‘/\W/‘, ‘a‘);
//匹配 0-9
echo preg_match(‘/\d/‘, ‘1‘);
//匹配非 0-9
echo preg_match(‘/\D/‘, ‘1‘);
//匹配空白字符
echo preg_match(‘/\s/‘, ‘ ‘);
//匹配非空白字符
echo preg_match(‘/\S/‘, ‘a‘);
//匹配单词的边界
echo preg_match(‘/^abc\b$/‘, ‘abc‘);
//匹配非单词的边界
echo preg_match(‘/^ab\Bc$/‘, ‘abc‘);
//匹配特殊字符
echo preg_match(‘/\//‘, ‘/‘);
修饰符
//匹配时不区分大小写
echo preg_match(‘/ycku/i‘, ‘YCKU‘);
//匹配时多行识别,换行处理解为结尾
echo preg_match(‘/ycku$/m‘, "This is ycku\n, This is a teacher!");
//匹配时忽略掉模式中的空白
echo preg_match(‘/yck u/x‘, ‘ycku‘);
//匹配时必须从头开始匹配
echo preg_match(‘/ycku/A‘, ‘ycku‘);
正则函数
1.使用 preg_grep 函数返回匹配模式的条目。
//需要匹配的数组
$language = array(‘php‘, ‘asp‘, ‘jsp‘, ‘python‘, ‘go‘);
//匹配返回新数组
$array = preg_grep(‘/p$/‘, $language);
//输出
print_r($array);
//取反操作
$array = preg_grep(‘/p$/‘, $language, PREG_GREP_INVERT);
2.使用 preg_match_all 函数匹配返回所有匹配元素。
//进行全局匹配
preg_match_all(‘/php[1-6]/‘,
‘php1sdflkjphp2sdlkfjphp3sdfsphp4‘, $array);
//输出
print_r($array);
3.使用 preg_quote 函数将带有正则符号的字符转义
//将正则的特殊字符转义
echo preg_quote(‘[第一回]‘);
//指定要转义的字符
echo preg_quote(‘[第一回/]‘, ‘/‘);
4.使用 preg_split 函数分割匹配到的字符串
//按照.和@进行分割
$array = preg_split(‘/[\.@]/‘, ‘yc60.com@gmail.com‘);
//输出
print_r($array)
5.使用 preg_replace 函数进行搜索和替换。
//替换并输出
echo preg_replace(‘/php[1-6]/‘, ‘ruby‘, ‘This is php5, This is php4‘);
注意:还有一个等价函数:preg_filter,支持版本为:>=5.3、7
6.使用 preg_replace_callback 搜索后在回调里进行替换。
//输出
echo preg_replace_callback(‘/(\w+)\s(\w+)/‘, function($matches){
return $matches[2];
} , ‘My php7‘);
7.使用 preg_replace_callback_array 搜索后在回调函数里进行替换。
//只支持 PHP7
echo preg_replace_callback_array(
array(
‘/(\w+)\s(\w+)/‘=>function ($matches) {
return $matches[2];
}
)
, ‘My php7‘);
正则模式
1.电子邮件验证
//用户名部分可以包含 a-zA-z0-9_可以用\w,还包含.和-号
//域名部分只要是 a-z0-9 外加-号
//后缀部分限制在 2-4 位,只能是英文字母
//电子邮件验证不区分大小写
echo preg_match(‘/^([\w\.-]+)@([a-z0-9-]+)\.([a-z]{2,4})$/i‘,
‘yc60.com@gmail.com‘);
2.使用修饰符 U 禁止贪婪
//把<b>...</b>替换成<strong>...</strong>
echo preg_replace(‘/<b>(.*)<\/b>/U‘, ‘<strong>\1</strong>‘, ‘This is a
<b>teacher</b>!This is a <b>teacher</b>!‘);
注意:这里用到了分组的反向引用\1,表示获取源字符串的对应模式的第一个分组的
内容。U 禁止贪婪在这里例子很明显,就是尽可能匹配最近的字符,而不是最远的。
3.前后断言模式
这种模式,表示当前的字符的前后紧跟的是不是指定的字符,如果是就匹配成功,反之
不成功
//大的前面一个字符紧跟着斯
//大的后面一个字符紧跟着林
echo preg_match(‘/(?<=斯)大(?=林)/‘, ‘俄国的斯大林同志!‘);
//大的前面一个字符不能紧跟着斯
//大的后面一个字符不能紧跟着林
echo preg_match(‘/(?<!斯)大(?!林)/‘, ‘俄国的斯大林同志!‘);
4.设置非捕获组?:
//?:可以设置当前组不被捕获到
preg_match(‘/(?:[\w-]+)\.([a-z]{2,4})/‘, ‘ycku.com‘, $matches);
//输出
print_r($matches);
5.逆向引用
//\1 表示第一个分组匹配到的值,用这个值进行匹配
preg_match(‘/([a-zA-Z]+)\s\1/‘, ‘This This is a teacher!‘, $matches);
//输出
print_r($matches);
6.惰性匹配
//只要在要匹配的量词后面加个问号,就能实现惰性匹配
preg_match(‘/This+?/i‘, ‘Thisssssssssssss‘, $matches);
//输出
print_r($matches);
原文地址:http://8818968.blog.51cto.com/8808968/1979020