正则表达式的作用:分割,查找,匹配,替换字符串
分隔符:正斜线(/)hash符号(#)以及取反符号(~)
通用原子:
\d,十进制的0-9
\D,取反,除了0-9
\w,数字,字母,下划线
\W,取反
\s, 空白符
\S,取反
元字符:
. :除了换行符任意字符
* :匹配前面的内容出现0次一次或者多次
? : 匹配前面的内容出现0次或者一次
^ :必须以它开头
$ : 必须以它结尾
+ : 匹配前面的内容出现一次或者多次
{n}: 出现n次
{n,}:大于等于n次
{n,m}:大于等于n,小于等于m次
[]:集合。例如[abc]匹配a或者b或者c
():代表一个整体 //用来后向引用 \\1
[^]:抑扬符代表的是取反 例如:[^abc]代表除了a,b,c其他字符
|:
[-]:代表范围 例如:[0-9]
模式修正符:
i:不区分大小写
m:将字符串进行分割(换行),对每一行进行逐行匹配。多文本模式
s:字符串太多的话会换行,单文本模式
U:取消贪婪模式
x:忽略模式中的空白符
A:必须以这个模式开头
D:修正$对\n 反斜线n/n的忽略
u:utf-8中文匹配
后向引用:
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>/'; //括号引用
$result = preg_replace($pattern,"'\\1'",$str); //\\1代表第一个括号里面引用的内容
var_dump($result);//abc
贪婪模式
$str = '<b>abc</b><b>bcd</b>';
//$pattern = '/<b>.*?<\/b>/'; //加个?表示取消贪婪模式
$pattern = '/<b>.*<\/b>/U'; //加个U表示取消贪婪模式
preg_match($pattern,$str,$result);
var_dump($result);
运行结果:
array(1) {
[0] =>
string(10) "<b>abc</b>"
}
正则表达式函数
1. preg_match()
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
$pattern: 要搜索的模式,字符串形式。
$subject: 输入字符串。
$matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
返回值
返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索
2. preg_match_all()
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
返回值
返回完整匹配次数(可能是0),或者如果发生错误返回FALSE。
3. preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数
返回值
如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
例:
4. preg_split()
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通过一个正则表达式分隔给定字符串。
参数说明:
$pattern: 用于搜索的模式,字符串形式。
$subject: 输入字符串。
$limit: 可选,如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制", 作为php的标准,你可以使用null跳过对flags的设置。
$count: 可选,可以是任何下面标记的组合(以位或运算 | 组合):
· PREG_SPLIT_NO_EMPTY: 如果这个标记被设置, preg_split() 将进返回分隔后的非空部分。
· PREG_SPLIT_DELIM_CAPTURE: 如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。
· PREG_SPLIT_OFFSET_CAPTURE: 如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量. 注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第1个元素为该子串在subject 中的偏移量组成的数组。
例:
5. preg_filter()
preg_filter() 等价于 preg_replace() ,但它仅仅返回与目标匹配的结果。
返回值
返回一个使用 pattern 边界分隔 subject 后得到的子串组成的数组。
例:
例:匹配中文字符
$str = 'dfsdf中国fds文字fds';
//$pattern = '/[\x{4e00}-\x{9fa5}]+/u'; //utf-8模式
$pattern = '/['.chr(0xb0).'-'.chr(0xf7).']['.chr(0xa1).'-'.chr(0xfe).']/'; //gbk模式
preg_match_all($pattern,$str,$match);
var_dump($match);
例:获取<img标签中src属性中的值>
$str = '<html><body><img alt="test" src="1.jpg" /></body></body></html>';
$parttern = '/<img.*?src="(.*?)".*?\/?>/i';
preg_match($parttern,$str,$match);
//$preg_replace($parttern,'\\2',$str);
var_dump($match);
运行结果
array(2) {
[0] =>
string(30) "<img alt="test" src="1.jpg" />"
[1] =>
string(5) "1.jpg"
}
手机号:/1[3578]\d{9}/
邮箱:/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[_a-z0-9-]+(\.[_a-z0-9-]+)*(\.[a-z]{2,})