foo ——————字符串“foo” ^foo ——————以“foo”开头的字符串 foo$ ——————以“foo”结尾的字符串 ^foo$ ——————“foo”开头和结尾,(只能是他自己 ) [abc]—————— a 或者b 或者c [a-z] —————— a到z之间任意字母 [^A-Z]——————除了 A-Z这些之外的字符 (gif|jpg)——————“gif”或者 “jpeg” [a-z]+—————— 一个或者多个 a到z之间任意字母 [0-9.-]—————— 0-9之间任意数字,或者 点 或者 横线 ^[a-zA-Z0-9_]{1,}$—————— 至少一个字母数字下划线 ([wx])([yz])—————— wy或wz或xy或xz [^A-Za-z0-9]—————— 字符数字之外的字符 ([A-Z]{3}|[0-9]{4})—————— 三个大写字母或者4个数字 常用的正则表达式 1、非负整数:”^\d+$” 2、正整数:”^[0-9]*[1-9][0-9]*$” 3、非正整数:”^((-\d+)|(0+))$” 4、负整数:”^-[0-9]*[1-9][0-9]*$” 5、整数:”^-?\d+$” 6、非负浮点数:”^\d+(\.\d+)?$” 7、正浮点数:”^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” 8、非正浮点数:”^((-\d+\.\d+)?)|(0+(\.0+)?))$” 9、负浮点数:”^(-((正浮点数正则式)))$” 10、英文字符串:”^[A-Za-z]+$” 11、英文大写串:”^[A-Z]+$” 12、英文小写串:”^[a-z]+$” 13、英文字符数字串:”^[A-Za-z0-9]+$” 14、英数字加下划线串:”^\w+$” 15、E-mail地址:”^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$” 16、URL:”^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”
preg_match() 该函数preg_match按照模式去匹配字符串,如果符合则返回TRUE,否则返回FALSE preg_match_all() 该函数 preg_match_all() 在字符串中匹配出全部符合模式的字符串. * preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match.html * preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 FALSE。 * http://www.yesky.com/imagesnew/software/php/zh/function.preg-match-all.html preg_replace() 该函数与ereg_replace()类似,不同在于它利用匹配的模式去替换输入的参数 http://www.yesky.com/imagesnew/software/php/zh/function.preg-replace.htm preg_split() 该函数与split()类似 不同在于它将与正则表达式匹配的字符当做分割的模式 http://www.yesky.com/imagesnew/software/php/zh/function.preg-split.html preg_grep() 该函数preg_grep() 匹配数组中全部元素,返回符合正则表达式的元素组成的数组 preg_quote() 转义正则表达式字符 需要我们用程序处理的数据并不总是预先以数据库思维设计的,或者说是无法用数据库的结构去存储的。
比如模版引擎解析模版、垃圾敏感信息过滤等等。 一般这种情况,我们用正则按我们的规则去匹配preg_match、替换preg_replace。 但一般的应用中,无非是些数据库CRUD,正则摆弄的机会很少。 根据前面说的,两种场景:统计分析,用匹配;处理用替换。 PHP preg_replace() 正则替换,与Javascript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素。 复制代码 代码如下: preg_replace (正则表达式, 替换成, 字符串, 最大替换次数【默认-1,无数次】, 替换次数) 大部分语言的正则表达式都是差不多的,不过也有细微的差异。 PHP 正则表达式
上表是正则表达式比较全面的解释,而商标中的正则字符都有特殊含义,已经不再代表原字符含义。如正则表达式中“+”不代表加号,而是代表匹配一次或多次。而如果想要让“+”表示加号,则需要在其前面加上“\”转义,也就是用“\+”表示加号。 复制代码 代码如下: 1+1=2 正则表达式是: 1\+1=2 而正则表达式 1+1=2 可以代表,多个1=2,即: 11=2 正则表达式:1+1=2 111=2 正则表达式:1+1=2 1111=2 正则表达式:1+1=2 ……
也就是说所有正则字符都有特定含义,如果需要再用来表示原字符含义,就需要在前面加“\”转义,即使非正则字符,用“\”转义也是没有问题的。 复制代码 代码如下: 1+1=2 正则表达式也可以是: \1\+\1\=\2 对所有字符都转义,但是这种不建议使用。
而正则表达式必须要使用定界符包围起来,在Javascript中定界符是“/”,而在PHP中,比较常见的是用“/”定界,也可以用“#”定界,而且外面还需要用引号包围起来。 如果正则表达式包含这些定界符,您就需要对这些字符进行转义。 PHP 正则表达式定界符 大多数语言的正则表达式都是由“/”作为定界符的,而在PHP中,还可以使用“#”定界,如果字符串中包含大量“/”字符,在使用“/”定界的时候,就需要对这些“/”转义,而使用“#”就不需要转义,更简洁。 代码如下: <?php $weigeti='W3CSchool 在线教程的网址是 http://e.jb51.net/ ,你能把这个网址替换成正确的网址吗?'; // 上面的要求就是把http://e.jb51.net/ 替换成 http://e.jb51.net/w3c/ // 其中的 . : - 都是正则符号,所以需要转义,而 / 是定界符,如果字符串中包含 / 定界符,就需要转义 echo preg_replace('/http\:\/\/www\.jb51\.net\//','http://e.jb51.net/w3c/',$weigeti); // 在 #作为定界符,/ 就不再是定界符的含义,就不需要转义了。 echo preg_replace('#http\://www\.jb51\.net/#','http://e.jb51.net/w3c/',$weigeti); //上面两条输出结果都一样,【W3CSchool 在线教程的网址是 http://e.jb51.net/w3c/ ,你能把这个网址替换成正确的网址吗?】 ?>
通过上面的两条PHP 正则替换代码我们可以发现,如果正则语句中包含大量“/”,无论使用“/” 还是 “#”做定界符都是可以的,但是使用“#”能让代码看起来更简洁。但是E维科技建议您还是保持使用“/”作为定界符,因为在Javascript等语言中,只能使用“/”作为定界符,这样写起来可以形成习惯,贯通于其他语言中。 PHP 正则表达式修饰符 修饰符被放在PHP正则表达式定界符“/”尾部,在正则表达式尾部引号之前。 代码如下: i 忽略大小写,匹配不考虑大小写 m 多行独立匹配,如果字符串不包含[\n]等换行符就和普通正则一样。 s 设置正则符号 . 可以匹配换行符[\n],如果没有设置,正则符号.不能匹配换行符\n。 x 忽略没有转义的空格 e eval() 对匹配后的元素执行函数。 A 前置锚定,约束匹配仅从目标字符串开始搜索 D 锁定$作为结尾,如果没有D,如果字符串包含[\n]等换行符,$依旧依旧匹配换行符。如果设置了修饰符m,修饰符D 就会被忽略。 S 对非锚定的匹配进行分析 U 非贪婪,如果在正则字符量词后加“?”,就可以恢复贪婪 X 打开与perl 不兼容附件 u 强制字符串为UTF-8编码,一般在非UTF-8编码的文档中才需要这个。建议UTF-8环境中不要使用这个,据E维科技调查使用这个会有一个Bug。
如果您熟悉Javascript 的正则表达式,或许一定熟悉Javascript 正则表达式的修饰符“g”,代表匹配所有符合条件的元素。而在PHP 正则替换中,是匹配所有符号条件的元素,所以不存在Javascript 修饰符“g”。 PHP 正则中文和忽略大小写PHP preg_replace() 是区分大小写的,同时只能匹配ASCII编码内的字符串,如果需要匹配不区分大小写和中文等字符需要添加相应的修饰符 i 或 u。 代码如下: <?php $weigeti='W3CSchool 在线教程网址:http://www.jb51.net/w3school/'; echo preg_replace('/W3CSchool/','w3c',$weigeti); //大小写不同,输出【w3c 在线教程网址:http://www.jb51.net/w3school/】 echo preg_replace('/W3CSchool/i','w3c',$weigeti); //忽略大小写,执行替换输出【w3c 在线教程网址:http://e.jb51.net/w3c/】 echo preg_replace('/网址/u','',$weigeti); //强制 UTF-8中文,执行替换,输出【W3CSchool 在线教程:http://www.jb51.net/w3school/】 ?>
大小写和中文在PHP中都是敏感的,但是在Javascript正则中,只对大小写敏感,忽略大小写也是通过修饰符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。 PHP 正则换行符实例 PHP 正则表达式在遇到换行符时,会将换行符当做字符串中间一个普通字符。而通用符号.不能匹配\n,所以遇到带有换行符的字符串正则会有很多要点。 代码如下: <?php // 想要把上面$weigeti 替换成jb51.net echo preg_replace('/^[A-Z].*[A-Z]$/','',$weigeti); echo preg_replace('/^[A-Z].*[A-Z]$/s','',$weigeti); echo preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti); $p='/^[A-Z].*[A-Z]$/';
$preg_m === $a.$b.$c.$d;
以后您在使用PHP 抓取某个网站内容,并用正则批量替换的时候,总无法避免忽略获取的内容包含换行符,所以在使用正则替换的时候一定要注意。 PHP 正则匹配执行函数PHP 正则替换可以使用一个修饰符e,代表 eval() 来执行匹配后的内容某个函数。 代码如下: <?php $weigeti='W3CSchool 在线教程网址:http://www.jb51.net ,你Jbzj!了吗?'; // 将上面网址转为小写 echo preg_replace('/(http\:[\/\w\.\-]+\/)/e','strtolower("$1")',$weigeti); // 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了 // 输出 【W3CSchool 在线教程网址:http://www.jb51.net ,你Jbzj!了吗?】 ?>
根据上面代码,尽管匹配后的函数 strtolower() 在引号内,但是依旧会被eval()执行。 正则替换匹配变量向后引用 如果您熟悉Javascript,一定对$1 $2 $3 …… 等向后引用比较熟悉,而在 PHP 中这些也可以被当作向后引用参数。而在PHP中,还可以使用 \1 \\1 来表示向后引用。 向后引用的概念就是匹配一个大片段,这个正则表达式内部又被用括号切割成若干小匹配元素,那么每个匹配元素就被按照小括号序列用向后引用代替。 代码如下: <?php echo preg_replace('/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/','$1',$weigeti); echo preg_replace('/^(.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+$/','栏目:$1<br>网址:$2<br>商标:$3',$weigeti);
// 括号中括号,外面括号先计数 验证域名
删除重复的标点
匹配一个XML或者HTML标签
检验密码的复杂度
WordPress: 使用正则获得 帖子上的图片
移除图片的链接
PHP 常用正则表达式整理表单验证匹配验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-z A-Z]$ 验证账号,不能有空格,不能非数字:^\d+$ 验证用户密码,以字母开头,长度在 6-18 之间:^[a-zA-Z]\w{5,17}$ 验证是否含有 ^%&',;=?$\ 等字符:[^%&',;=?$\x22]+ 匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配腾讯QQ号:[1-9][0-9]{4,} 匹配日期,只能是 2004-10-22 格式:^\d{4}\-\d{1,2}-\d{1,2}$ 匹配国内电话号码:^\d{3}-\d{8}|\d{4}-\d{7,8}$ 匹配中国邮政编码:^[1-9]\d{5}(?!\d)$ 匹配身份证:\d{14}(\d{4}|(\d{3}[xX])|\d{1}) 不能为空且二十字节以上:^[\s|\S]{20,}$ 字符匹配匹配由 26 个英文字母组成的字符串:^[A-Za-z]+$ 匹配由 26 个大写英文字母组成的字符串:^[A-Z]+$ 匹配由 26 个小写英文字母组成的字符串:^[a-z]+$ 匹配由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$ 匹配由数字、26个英文字母或者下划线组成的字符串:^\w+$ 匹配空行:\n[\s| ]*\r 匹配任何内容:[\s\S]* 匹配中文字符:[\x80-\xff]+ 或者 [\xa1-\xff]+ 只能输入汉字:^[\x80-\xff],{0,}$ 匹配双字节字符(包括汉字在内):[^\x00-\xff] 匹配数字只能输入数字:^[0-9]*$ 只能输入n位的数字:^\d{n}$ 只能输入至少n位数字:^\d{n,}$ 只能输入m-n位的数字:^\d{m,n}$ 匹配正整数:^[1-9]\d*$ 匹配负整数:^-[1-9]\d*$ 匹配整数:^-?[1-9]\d*$ 匹配非负整数(正整数 + 0):^[1-9]\d*|0$ 匹配非正整数(负整数 + 0):^-[1-9]\d*|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)$ 匹配非负浮点数(正浮点数 + 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$ 其他匹配HTML标记的正则表达式(无法匹配嵌套标签):<(\S*?)[^>]*>.*?</\1>|<.*? /> 匹配网址 URL :[a-zA-z]+://[^\s]* 匹配 IP 地址:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?) 匹配完整域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.? 提示
|
|