首页 > Web开发 > 详细

浅谈正则表达式-PHP为例

时间:2015-06-12 19:21:08      阅读:337      评论:0      收藏:0      [点我收藏+]

第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习。

基本概念

  正则表达式=普通字符(如a-z)+分隔符(正斜线(/)、hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两者的组合;

匹配原理

  简单描述下,通常是由字符串位置0开始尝试匹配,若匹配成功存储这个子串;若在某一个位置匹配失败则后移一个位置,从位置1开始重新匹配。直到匹配成功或者匹配到最后一个位置都没有找到成功的子串。

匹配模式

  看名字,是不是想到了设计模式中的单例模式了呢?

  1. 贪婪模式

    在可匹配与可不匹配的时候,优先匹配,比如量词用*或+

  2. 懒惰模式

    在可匹配与可不匹配的时候,优先不匹配,比如量词用?

用途

  1. 查找:检查一个串是否包含某个子串,而子串是符合正则表达式条件的子串,最后得到所有符合条件的子串集合
  2. 替换:将上一条查找出来的子串替换成特定的字符串

正则分隔符

字符 说明 备注
/表达式/ 一个完整的正则表达式的边界  若表达式内有/,需要用转义字符\转义    $p="/ab\//"
#表达式# 一个完整的正则表达式的边界2  若表达式内有#,需要用转义字符\转义    $p="#ab/\##"
~表达式~ 一个完整的正则表达式的边界3  若表达式内有~,需要用转义字符\转义    $p="~ab/#\~~"
|表达式| 一个完整的正则表达式的边界4 若表达式内有|,需要用转义字符\转义    $p="|ab/#\~\||"

 

元字符

边界定位符

字符 说明 备注
^开头, $结尾 断言。表示这个子串必须完全匹配目标字符串。^匹配字符串开头第一个字母前的位置,$匹配字符串结尾字母的后一个位置 见代码示例1
\b 匹配一个单词边界,匹配单词和空格之间的位置  
\B 匹配一个非单词边界,匹配单词和空格之间的位置  

量词元字符

字符 说明(都是返回能得到的最长子串) 备注
* 0次或多次匹配前面的子表达式, 等价于{0,}
0次或1次匹配前面的子表达式 等价于{0,1}懒惰模式就用这个
+ 1次或多次匹配前面的子表达式 等价于{1,}
{n} n次匹配前面的子表达式  
{n,} 大于等于n次匹配前面的子表达式  
{,n} 小于等于n次匹配前面的自表达式  
{n,m} 最少n次,最大m次,匹配前面的自表达式  

普通元字符

字符 说明 备注
 \d  数字,等价于[0-9]  
 \D  非数字,等价于[^0-9]  
 \w  匹配字母、数字、下划线,等价于[a-zA-z0-9_]  
\W  匹配非[^a-zA-z0-9_]  
\s  匹配任何空白字符(包括空格、制表符、换页符),等价于[\n\f\t\r\v]  
\S  匹配任何非空白字符(包括空格、制表符、换页符),等价于[^\n\f\t\r\v]  
\ 转义字符  
. 匹配除换行符(\n)之外的任何字符  
[]

包含能得到一个字符的表达式,自带“或”的属性,后面可以跟修饰符。

方括号内,个别字符有不同的含义:

  ^仅在作为第一个字符(方括号内)时,表明字符类取反

  - 标记字符范围

  \ 转义字符

 
() 包含一个子表达式,要表达“或”需要“|”  
| 开始一个可选分支  

分组元字符

字符 说明 备注
() 将表达式括起来,与其他元字符配合使用  

引用

字符 说明 备注
& 在替换字符串中,符号&代表整个正则表达式所匹配的字符串的内容  仅在替换时使用
\n(n=1,2...) 转移数字\n代表索索字符串的第n个括号中正则表达式所匹配的字符串内容  查找、替换都能使用

各元字符的优先级

优先级 字符集 说明
1 \ 转义
2 ^\w\d等  
3 (),[]  
4 *,+,?,{} 两次
5 ^,$ 断言,位置
6 | 分组

 

PHP中正则相关的几个方法

1.preg_match($pattern, $subject, $matches); 

   用途:返回值是匹配成功的次数0或者1,在匹配到1次以后就会停止搜索

   参数:$pattern 为正则表达式;$subject为被搜索的字符串;$matches可选,存储匹配结果的数组,$matches[0]包含整个模式匹配的文本,$matches[1]为第一个括号中的子模式所匹配的文本,依次类推

   代码示例:

$subject = "abcdef";
$pattern = ‘/a(.*)(\w)d/‘;
preg_match($pattern, $subject, $matches);
print_r($matches); 

 返回结果:

  Array
  (
    [0] => abcd
    [1] => b
    [2] => c
  )  

2.preg_match_all($pattern, $subject, $matches[,int flags]); 

 用途:循环获取一个列表的匹配结果数组。

 参数:$pattern 为正则表达式;$subject为被搜索的字符串;

    $matches可选,存储匹配结果的多维数组,flags有多个值。http://www.360doc.com/content/12/0828/13/10503611_232787142.shtml

    case: flag=1,PREG_PARTTERN_ORDER   默认值,$matches[0]存储的是全部模式匹配的数组,$matches[1]为第一个括号中的子模式所匹配的文本array,依次类推。

    case: flag=2,PREG_SET_ORDER ,$matches[0]存储的是第一括号里面模式匹配的所有数组,$matches[1]为第而括号里面模式匹配的所有数组,依次类推

    case: flag=3,PREG_OFFSET_CAPTURE,m

    $matches[0]包含整个模式匹配的文本array,$matches[1]为第一个括号中的子模式所匹配的文本array,依次类推。

常用示例

$mail="/[\w|.]+@\w+.\w{3}/";匹配邮箱,@前面可以是.或者字母、数字、下划线,@后面是字母、数字、下划加.再加字母、数字、下划

 

浅谈正则表达式-PHP为例

原文:http://www.cnblogs.com/Mrs-cc/p/4571520.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!