1.正则基础知识
行定位符(^与$)
行定位符是用来形貌字符串的边境。“$”示意行末端“^”示意行最先如"^de",示意以de开首的字符串 "de$",示意以de末端的字符串。
单词定界符
我们在查找的一个单词的时刻,如an是不是在一个字符串”gril and body”中存在,很明显假如婚配的话,an肯定是能够婚配字符串“gril and body”婚配到,怎样才能让其婚配单词,而不是单词的一部份呢?这时刻,我们能够是哟个单词定界符\b。
\ban\b 去婚配”gril and body”的话,就会提醒婚配不到。
固然另有一个大写的\B,它的意义,和\b恰好相反,它婚配的字符串不能使一个完全的单词,而是其他单词或字符串中的一部份。如\Ban\B。
挑选字符(|) ,示意或
挑选字符示意或的意义。如Aa|aA,示意Aa或许是aA的意义。注重运用”[]”与”|”的区分,在于”[]”只能婚配单个字符,而”|”能够婚配恣意长度的字符串。在运用”[]”的时刻,每每合营衔接字符”-“一同运用,如[a-d],代表a或b或c或d。
消除字符,消除操纵
正则表达式供应了”^”来示意消除不符合的字符,^平常放在[]中。如[^1-5],该字符不是1~5之间的数字。
限定符(?*+{n,m})
限定符主如果用来限定每一个字符串涌现的次数。
限定字符 | 寄义 |
---|---|
? | 零次或一次 |
* | 零次或屡次 |
+ | 一次或屡次 |
{n} | n次 |
{n,} | 最少n次 |
{n,m} | n到m次 |
如(D+)示意一个或多个D
点号操纵符
婚配恣意一个字符(不包含换行符)
表达式中的反斜杠(\)
表达式中的反斜杠有多重意义,如转义、指定预定义的字符集、定义断言、显现不打印的字符。
转义字符
转义字符主如果将一些特别字符转为一般字符。而这些经常使用特别字符有”.”,”?”、”\”等。
指定预定义的字符集
字符 | 寄义 |
---|---|
\d | 恣意一个十进制数字[0-9] |
\D | 恣意一个非十进制数字 |
\s | 恣意一个空缺字符(空格、换行符、换页符、回车符、字表符) |
\S | 恣意一个非空缺字符 |
\w | 恣意一个单词字符 |
\W | 恣意个非单词字符 |
###显现不可打印的字符
字符 | 寄义 |
---|---|
\a | 报警 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 字表符 |
括号字符()
在正则表达式中小括号的作用重要有:
转变限定符如(|、* 、^)的作用局限
如(my|your)baby,假如没有”()”,|将婚配的是要么是my,要么是yourbaby,有了小括号,婚配的就是mybaby或yourbaby。
举行分组,便于反向援用
情势修饰符
情势修饰符的作用是设定情势,也就是正则表达式怎样诠释。php中重要情势以下表:
修饰符 | 申明 |
---|---|
i | 疏忽大小写 |
m | 多文本情势 |
s | 单行文本情势 |
x
|
疏忽空缺字符 |
U 懒散情势 (不写默许贪欲情势)
2.经常使用php正则函数及示例
a. preg_grep() 函数
preg_grep 函数用于返回婚配情势的数组条目。
语法
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
返回给定数组 input 中与情势 pattern 婚配的元素构成的数组。
参数申明:
$pattern:要搜刮的情势,字符串情势。
$input:输入的数组。
$flags:假如设置为 PREG_GREP_INVERT,这个函数返回输入数组中与给定情势 pattern 不婚配的元素构成的数组。
实例
返回数组中指定婚配的元素:
<?php $array = array(1, 2, 3.4, 53, 7.9); // 返回一切包含浮点数的元素 $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array); print_r($fl_array); ?>
实行效果以下所示:
Array ( [2] => 3.4 [4] => 7.9 )
能够看出 preg_grep 只返回了数组中的浮点数。
b.preg_match() 函数
PHP 正则表达式(PCRE)
preg_last_error 函数用于实行一个正则表达式婚配。
语法
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜刮 subject 与 pattern 给定的正则表达式的一个婚配。
参数申明:
$pattern: 要搜刮的情势,字符串情势。
$subject: 输入字符串。
$matches: 假如供应了参数matches,它将被添补为搜刮效果。 $matches[0]将包含完全情势婚配到的文本, $matches[1] 将包含第一个捕捉子组婚配到的文本,以此类推。
$flags:flags 能够被设置为以下标记值:
PREG_OFFSET_CAPTURE: 假如通报了这个标记,关于每一个涌现的婚配返回时会附加字符串偏移量(相干于目的字符串的)。 注重:这会转变添补到matches参数的数组,使其每一个元素成为一个由 第0个元素是婚配到的字符串,第1个元素是该婚配字符串 在目的字符串subject中的偏移量。
offset: 一般,搜刮从目的字符串的最先位置最先。可选参数 offset 用于 指定从目的字符串的某个未知最先搜刮(单元是字节)。
返回值
返回 pattern 的婚配次数。 它的值将是 0 次(不婚配)或 1 次,由于 preg_match() 在第一次婚配后 将会住手搜刮。preg_match_all() 差别于此,它会一向搜刮subject 直到抵达末端。 假如发作毛病preg_match()返回 FALSE。
实例
查找文本字符串"php":
<?php //情势分开符后的"i"标记这是一个大小写不敏感的搜刮 if (preg_match("/php/i", "PHP is the web scripting language of choice.")) { echo "查找到婚配的字符串 php。"; } else { echo "未发明婚配的字符串 php。"; } ?>
实行效果以下所示:
查找到婚配的字符串 php。
查找单词"word"
<?php /* 情势中的\b标记一个单词边境,所以只要自力的单词"web"会被婚配,而不会婚配 * 单词的部份内容比方"webbing" 或 "cobweb" */ if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) { echo "查找到婚配的字符串。\n"; } else { echo "未发明婚配的字符串。\n"; } if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) { echo "查找到婚配的字符串。\n"; } else { echo "未发明婚配的字符串。\n"; } ?>
实行效果以下所示:
查找到婚配的字符串。 未发明婚配的字符串。
猎取 URL 中的域名
<?php // 从URL中猎取主机称号 preg_match('@^(?:http://)?([^/]+)@i', "http://www.runoob.com/index.html", $matches); $host = $matches[1]; // 猎取主机称号的背面两部份 preg_match('/[^.]+\.[^.]+$/', $host, $matches); echo "domain name is: {$matches[0]}\n"; ?>
实行效果以下所示:
domain name is: runoob.com
c.preg_match_all() 函数
PHP 正则表达式(PCRE)
preg_match_all 函数用于实行一个全局正则表达式婚配。
语法
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜刮 subject 中一切婚配 pattern 给定正则表达式的婚配效果而且将它们以 flag 指定递次输出到 matches 中。
在第一个婚配找到后, 子序列继承从末了一次婚配位置搜刮。
参数申明:
$pattern: 要搜刮的情势,字符串情势。
$subject: 输入字符串
$matches: 多维数组,作为输出参数输出一切婚配效果, 数组排序经由过程flags指定。
$flags:能够连系下面标记运用(注重不能同时运用PREG_PATTERN_ORDER和 PREG_SET_ORDER):
PREG_PATTERN_ORDER: 效果排序为$matches[0]保留完全情势的一切婚配, $matches[1] 保留第一个子组的一切婚配,以此类推。
PREG_SET_ORDER: 效果排序为$matches[0]包含第一次婚配获得的一切婚配(包含子组), $matches[1]是包含第二次婚配到的一切婚配(包含子组)的数组,以此类推。
PREG_OFFSET_CAPTURE: 假如这个标记被通报,每一个发明的婚配返回时会增添它相对目的字符串的偏移量。
offset: 一般, 查找时从目的字符串的最先位置最先。可选参数offset用于 从目的字符串中指定位置最先搜刮(单元是字节)。
返回值
返回完全婚配次数(多是0),或许假如发作毛病返回FALSE。
实例
查找婚配 <b> 与 </b> 标签的内容:(本身经常使用猎取$pat_array[1])
<?php $userinfo = "Name: <b>PHP</b> <br> Title: <b>Programming Language</b>"; preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array); print_r($pat_array[0]); ?>
实行效果以下所示:
Array ( [0] => <b>PHP</b> [1] => <b>Programming Language</b> )
d. preg_replace() 函数
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。
实例
将 google 替换为 runoob
<?php $string = 'google 123, 456'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = 'runoob ${2},$3'; echo preg_replace($pattern, $replacement, $string); ?>
实行效果以下所示:
runoob 123,456
删除空格字符
<?php $str = 'runo o b'; $str = preg_replace('/\s+/', '', $str); // 将会转变成'runoob' echo $str; ?>
实行效果以下所示:
runoob
运用基于数组索引的搜刮替换
<?php $string = 'The quick brown fox jumped over the lazy dog.'; $patterns = array(); $patterns[0] = '/quick/'; $patterns[1] = '/brown/'; $patterns[2] = '/fox/'; $replacements = array(); $replacements[2] = 'bear'; $replacements[1] = 'black'; $replacements[0] = 'slow'; echo preg_replace($patterns, $replacements, $string); ?>
实行效果以下所示:
The bear black slow jumped over the lazy dog.
运用参数 count
<?php $count = 0; echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count); echo $count; //3 ?>
实行效果以下所示:
xp***to 3
e.preg_split() 函数
preg_replace 函数经由过程一个正则表达式分开字符串。
语法
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
经由过程一个正则表达式分开给定字符串。
参数申明:
$pattern: 用于搜刮的情势,字符串情势。
$subject: 输入字符串。
$limit: 可选,假如指定,将限定分开获得的子串最多只要limit个,返回的末了一个 子串将包含一切盈余部份。limit值为-1, 0或null时都代表"不限定", 作为php的规范,你能够运用null跳过对flags的设置。
$flags: 可选,能够是任何下面标记的组合(以位或运算 | 组合):
PREG_SPLIT_NO_EMPTY: 假如这个标记被设置, preg_split() 将进返回分开后的非空部份。
PREG_SPLIT_DELIM_CAPTURE: 假如这个标记设置了,用于分开的情势中的括号表达式将被捕捉并返回。
PREG_SPLIT_OFFSET_CAPTURE: 假如这个标记被设置, 关于每一个涌现的婚配返回时将会附加字符串偏移量. 注重:这将会转变返回数组中的每一个元素, 使其每一个元素成为一个由第0 个元素为分开后的子串,第1个元素为该子串在subject 中的偏移量构成的数组。
返回值
返回一个运用 pattern 边境分开 subject 后获得的子串构成的数组。
实例
猎取搜刮字符串的部份
<?php //运用逗号或空格(包含" ", \r, \t, \n, \f)分开短语 $keywords = preg_split("/[\s,]+/", "hypertext language, programming"); print_r($keywords); ?>
实行效果以下所示:
Array ( [0] => hypertext [1] => language [2] => programming )
将一个字符串分开为构成它的字符
<?php $str = 'runoob'; $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); print_r($chars); ?>
实行效果以下所示:
Array ( [0] => r [1] => u [2] => n [3] => o [4] => o [5] => b )
分开一个字符串并猎取每部份的偏移量
<?php $str = 'hypertext language programming'; $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE); print_r($chars); ?>
实行效果以下所示:
Array ( [0] => Array ( [0] => hypertext [1] => 0 ) [1] => Array ( [0] => language [1] => 10 ) [2] => Array ( [0] => programming [1] => 19 ) )
3.经常使用正则(参考作用)
一、校验数字的表达式
1 数字:
^[0-9]*$
2 n位的数字:
^\d{n}$
3 最少n位的数字:
^\d{n,}$
4 m-n位的数字:
^\d{m,n}$
5 零和非零开首的数字:
^(0|[1-9][0-9]*)$
6 非零开首的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})?$
8 正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
9 有两位小数的正实数:
^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:
^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:
^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:
^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:
^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:
^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:
^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:
^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
二、校验字符的表达式
1 汉字:
^[\u4e00-\u9fa5]{0,}$
2 英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的一切字符:
^.{3,20}$
4 由26个英文字母构成的字符串:
^[A-Za-z]+$
5 由26个大写英文字母构成的字符串:
^[A-Z]+$
6 由26个小写英文字母构成的字符串:
^[a-z]+$
7 由数字和26个英文字母构成的字符串:
^[A-Za-z0-9]+$
8 由数字、26个英文字母或许下划线构成的字符串:
^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包含下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包含下划线等标记:
^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 能够输入含有^%&',;=?$\"等字符:
[^%&',;=?$\x22]+
12 制止输入含有~的字符:
[^~\x22]+
三、特别需求表达式
1、 Email地点:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 、域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 、InternetURL:
[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 、手机号码:
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5 、电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
6 国内电话号码(0511-4405222、021-87888822):
\d{3}-\d{8}|\d{4}-\d{7}
7 、身份证号:
15或18位身份证:
^\d{15}|\d{18}$
15位身份证:
^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
18位身份证:
^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
8、 短身份证号码(数字、字母x末端):
^([0-9]){7,18}(x|X)?$
或
^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 、帐号是不是正当(字母开首,许可5-16字节,许可字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 、暗码(以字母开首,长度在6~18之间,只能包含字母、数字和下划线):
^[a-zA-Z]\w{5,17}$
11 、强暗码(必需包含大小写字母和数字的组合,不能运用特别字符,长度在8-10之间):
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12、 日期花样:
^\d{4}-\d{1,2}-\d{1,2}
13、 一年的12个月(01~09和1~12):
^(0?[1-9]|1[0-2])$
14 、一个月的31天(01~09和1~31):
^((0?[1-9])|((1|2)[0-9])|30|31)$
15 、钱的输入花样:
16 、1.有四种钱的示意情势我们能够接收:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":
^[1-9][0-9]*$
17、 2.这示意恣意一个不以0开首的数字,然则,这也意味着一个字符"0"不经由过程,所以我们采纳下面的情势:
^(0|[1-9][0-9]*)$
18 、3.一个0或许一个不以0开首的数字.我们还能够许可开首有一个负号:
^(0|-?[1-9][0-9]*)$
19 、4.这示意一个0或许一个能够为负的开首不为0的数字.让用户以0开首好了.把负号的也去掉,由于钱总不能是负的吧.下面我们要加的是申明能够的小数部份:
^[0-9]+(.[0-9]+)?$
20 、5.必需申明的是,小数点背面最少应该有1位数,所以"10."是不经由过程的,然则 "10" 和 "10.2" 是经由过程的:
^[0-9]+(.[0-9]{2})?$
21、 6.如许我们划定小数点背面必需有两位,假如你以为太苛刻了,能够如许:
^[0-9]+(.[0-9]{1,2})?$
22、 7.如许就许可用户只写一名小数.下面我们该斟酌数字中的逗号了,我们能够如许:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
23 、8.1到3个数字,背面随着恣意个 逗号+3个数字,逗号成为可选,而不是必需:
^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
24 、备注:这就是终究效果了,别忘了"+"能够用"*"替换假如你以为空字符串也能够接收的话(新鲜,为何?)末了,别忘了在用函数时去掉去掉谁人反斜杠,平常的毛病都在这里
25 、xml文件:
^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
26 、中文字符的正则表达式:
[\u4e00-\u9fa5]
27 、双字节字符:
[^\x00-\xff]
(包含汉字在内,能够用来盘算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
28 、空缺行的正则表达式:\n\s*\r (能够用来删除空缺行)
29 、HTML标记的正则表达式:
<(\S*?)[^>]*>.*?</\1>|<.*? /> (网上撒布的版本太蹩脚,上面这个也仅仅能部份,关于庞杂的嵌套标记照旧无计可施)
30 、首尾空缺字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (能够用来删除行首行尾的空缺字符(包含空格、制表符、换页符等等),异常有效的表达式)
31 、腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000最先)
32 、中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
33、 IP地点:\d+\.\d+\.\d+\.\d+ (提取IP地点时有效)
以上就是php正则的内容总结(细致)的细致内容,更多请关注ki4网别的相干文章!