正则表达式

PHP正则表达式,看这一篇就够啦!

前言#

不知道你们有没有这个感觉,看正则表达式就像看天文数字一样,什么电话号码、邮箱的正则表达式,上网复制一下粘贴下来就搞定了。完全不知道这写的是什么玩意。后来我自己也想学一下,因为感觉用处还是挺大的。看了看视频,额...真**简单。这里的话如果想看视频学习的话我推荐一下慕课网这门鬼斧神工之正则表达式课程,上手真的太快了。好了,废话不多说,开始搞事情。

基本语法#

界定符:#

标识一个正则表达式的开始和结束,用'/'或'#'或'{ }',因为语法'{ }'也可能是正则表达式的运算符,为了避免混淆,所以不建议使用。建议的用法如下:

Copy

$pattern ='/[0-9]/';//我喜欢这个,看起来比较简洁 $pattern ='#[0-9]#';

原子:#

可见原子:Unicode编码表中可用键盘输出后肉眼可见的字符,例如:标点 ; . / ? 或者英文字母,汉字等等可见字符

不可见原子:Unicode编码表中可用键盘输出后肉眼不可见的字符,例如:换行符 \n,Tab制表符\t, 空格等等,

一般只用这三个(换行符一般和其他字符一起匹配,因为只有换行符是匹配不到的)

小提示:匹配运算符前面需要加'\' 例如:'+' 号,匹配的话需要写出 '\+'

元字符#

原子的筛选方式:

| 匹配两个或者多个分支选择

[] 匹配方括号中的任意一个原子

[^] 匹配除方括号中的原子之外的任意字符;

例子:Duang|duang 或者 [Dd]uang 都可以匹配到Duang和duang

区间写法:[a-z]匹配a到z的字符, [0-9]匹配0到9的字符。也可以[a-z0-9]

. 匹配除换行符之外的任意字符

\d 匹配任意一个十进制数字,即{0-9]

\D 匹配任意一个非十进制数字[^0-9] 相当于[^\d]

\s 匹配一个不可见的原子,即[\f\n\r\t\v]

\S 匹配一个可见的原子,即[\f\n\r\t\v],相当于[\s]z

\w 匹配任意一个数字、字母或下划线,即[0-9a-zA-Z_]

\W 匹配任意一个非数字、字母或下划线,[0-9a-zA-Z_],相当于[\w]

量词#

{n} 表示其前面的原子刚好出现了n次。

[n] 表示其前面的原子最少出现n次

{n,m} 最少出现n次,最多出现m次

* 匹配0次、一次或者多次,即{0,}

+ 匹配一次或多次,即{1,}

? 匹配0或1次,即{0,1}

边界控制#

^ 匹配字符串开始的位置

$ 匹配字符串结尾的位置

例:^John 可以匹配到:John 但是匹配不到:123John,因为规定了字符串以John开头

模式单元#

() 匹配其中的整体为一个原子, 如: (X|x)iaomi , 可以匹配到 xiaomi

修正模式#

贪婪匹配#

匹配结果存在歧义时取其长(默认)

懒惰匹配#

匹配结果存在歧义时取其短,只需在正则表达式的后面'/'加上'U',例如'/[0-9]/U';

例子:

Copy

$subject ="test__123123123";preg_match('/test.+123/', $subject, $matches);//贪婪模式  var_dump($matches);preg_match('/test.+123/U', $subject, $matches);//懒惰模式var_dump($matches);

常见的修正模式:#

U 懒惰匹配

i 忽略英文字母的大小写

x 忽略正则表达式的空白符

s 让元字符'.' 匹配包括换行符在内的所有字符

常用函数#

preg_match#

执行匹配正则表达式

preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int

pattern: 要搜索的模式,字符串类型。

subject:输入字符串。

match: 如果提供了参数matches,它将被填充为搜索结果,数据结构为一维数组。

flags: 可以设置为PREG_OFFSET_CAPTURE,使用搜索结果的第0个元素为匹配的字符串,第1个元素为对应的偏移量(位置)

offset: 搜索从目标字符串的起始位置开始匹配。

返回值:匹配次数

类似函数preg_match_all,参数与preg_match一致

区别:

preg_match:只匹配一次,搜索结构match的数据结果为一维数组

preg_match_all:匹配全部,搜索结果match的数据结构为二维数组。

preg_replace#

执行一个正则表达式搜索和替换,返回值为替换后的字符串

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

pattern:要搜索的模式。可以是一个字符串或字符串数组。

replacement:用于替换的字符串或字符串数组

subject:要进行搜索和替换的字符串或字符串数组。

limit:替换的最大次数。默认是 -1(无限)。

count:替换次数。

类似函数preg_filter,参数与preg_replace一致

区别(使用数组进行匹配的时候才看得出区别):

preg_replace:不管是否有替换,返回全部结果

preg_filter:只返回匹配的结果。

preg_split#

通过一个正则表达式分隔字符串

preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] ) : array

$pattrn:用于搜索的模式,字符串形式。

subject:输入字符串

limit:将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。

flags:有以下标记的组合:

-- 1. PREG_SPLIT_NO_EMPTY: 返回分隔后的非空部分。

-- 2. PREG_SPLIT_DELIM_CAPTURE: 用分隔符'()'括号把匹配的捕获并返回。

-- 3. PREG_SPLIT_OFFSET_CAPTURE: 匹配返回时将会附加字符串偏移量

PREG_SPLIT_DELIM_CAPTURE这个参数可能比较难明白,举个例子看看:

Copy

$subject ="1a23b";  $a = preg_split('/[\d]/', $subject,-1, PREG_SPLIT_NO_EMPTY);  var_dump($a);  $a = preg_split('/([\d])/', $subject,-1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); var_dump($a);

输出如下:

array (size=2)

0 => string 'a' (length=1)

1 => string 'b' (length=1)

array (size=5)

0 => string '1' (length=1)

1 => string 'a' (length=1)

2 => string '2' (length=1)

3 => string '3' (length=1)

4 => string 'b' (length=1)

preg_grep#

返回匹配模式的数组条目

preg_grep ( string $pattern , array $input [, int $flags = 0 ] ) : array

$pattern:要搜索的模式,字符串形式

$input:输入数组

flags:如果不设置则返回匹配的数目,设置PREG_GREP_INVERT则返回不匹配的数目。

preg_quote#

转义正则表达式字符,返回为转义后的字符串

preg_quote ( string $str [, string $delimiter = NULL ] ) : string

str:输入字符串

delimiter:需要转义的字符串

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353