设为首页 收藏本站
查看: 260|回复: 0

[经验分享] [php]PHP 正则表达式

[复制链接]

尚未签到

发表于 2017-3-3 11:49:39 | 显示全部楼层 |阅读模式
  
DSC0000.png
  1. 需要知道的术语——下面的术语你知道多少?
  Δ  定界符

Δ  字域符


Δ  修饰符


Δ  限定符


Δ  脱字符


Δ  通配符(正向预查,反向预查)


Δ  反向引用


Δ  惰性匹配


Δ  注释


Δ  零字符宽





2.¤ 定界符,通常使用 "/"做为定界符开始和结束,也可以使用"#"。

$regex = '/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html$/i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
 preg_match中的$matches[0]将包含与整个模式匹配的字符串。 

    使用"#"定界符的代码如下.这个时候对"/"就不转义!
 

$regex = '#^http://([\w.]+)/([\w]+)/([\w]+)\.html$#i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
 
3.修饰符:用于改变正则表达式的行为。
 
  我们看到的('/^http:\/\/([\w.]+)\/([\w]+)\/([\w]+)\.html/i')中的最后一个"i"就是修饰符,表示忽略大小写,还有一个我们经常用到的是"x"表示忽略空格。
  贡献代码:

$regex = '/HELLO/';
$str = 'hello word';
$matches = array();
if(preg_match($regex, $str, $matches)){
echo 'No i:Valid Successful!',"\n";
}
if(preg_match($regex.'i', $str, $matches)){
echo 'YES i:Valid Successful!',"\n";
}
  介绍:<1>字符域:[\w]用方括号扩起来的部分就是字符域。 <2> 限定符:如[\w]{3,5}或者[\w]*或者[\w]+这些[\w]后面的符号都表示限定符。现介绍具体意义。
  {3,5}表示3到5个字符。
  {3,}超过3个字符,{,5}最多5个,{3}三个字符。
  * 表示0到多个. + 表示1到多个。
  脱字符号
  > 放在字符域(如:[^\w])中表示否定(不包括的意思)——“反向选择”
  >  放在表达式之前,表示以当前这个字符开始。(/^n/i,表示以n开头)。
  注意,我们经常管"\"叫"跳脱字符"。用于转义一些特殊符号,如".","/"
  4.通配符(lookarounds):断言某些字符串中某些字符的存在与否.

//lookarounds分两种:lookaheads(正向预查 ?=)和lookbehinds(反向预查?<=)。
//> 格式:
//正向预查:(?=) 相对应的 (?!)表示否定意思
//反向预查:(?<=) 相对应的 (?<!)表示否定意思
//前后紧跟字符?
$regex = '/(?<=c)d(?=e)/';  /* d 前面紧跟c, d 后面紧跟e*/
$str = 'abcdefgk';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
  例如:

echo "\n";
//否定意义:
$regex = '/(?<!c)d(?!e)/';  /* d 前面不紧跟c, d 后面不紧跟e*/
$str = 'abcdefgk';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";

//>字符宽度:零
//验证零字符代码
$regex = '/HE(?=L)LO/i';
$str = 'HELLO';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
//打印不出结果!
$regex = '/HE(?=L)LLO/i';
$str = 'HELLO';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
echo "\n";
//能打印出结果!
//说明:(?=L)意思是HE后面紧跟一个L字符。但是(?=L)本身不占字符,要与(L)区分,(L)本身占一个字符。

  5.捕获数据
  没有指明类型而进行的分组,将会被获取,供以后使用。

> 指明类型指的是通配符。所以只有圆括号起始位置没有问号的才能被捕捉。

> 在同一个表达式内的引用叫做反向引用。

> 调用格式: \编号(如\1)。




$regex = '/^(Chuanshanjia)[\w\s!]+\1$/';   
$str = 'Chuanshanjia thank Chuanshanjia';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}


 

> 避免捕获数据

   格式:(?:pattern)

   优点:将使有效反向引用数量保持在最小,代码更加、清楚。

 

>命名捕获组

   格式:(?P<组名>) 调用方式 (?P=组名)






$regex = '/(?P<author>chuanshanjia)[\s]Is[\s](?P=author)/i';
$str = 'author:chuanshanjia Is chuanshanjia';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}



 

6.惰性匹配(记住:会进行两部操作,请看下面的原理部分)
  格式:限定符?
  原理:"?":如果前面有限定符,会使用最小的数据。如“*”会取0个,而“+”会取1个,如过是{3,5}会取3个。
  先看下面的两个代码:

<?php
$regex = '/heL*/i';
$str = 'heLLLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
?>

<?php
$regex = '/heL*?/i';
$str = 'heLLLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
 
<?php
$regex = '/heL+?/i';
$str = 'heLLLLLLLLLLLLLLLL';
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}
  7.正则表达式的注释

格式:(?# 注释内容)

用途:主要用于复杂的注释

 

 贡献代码:是一个用于连接MYSQL数据库的正则表达式

$regex = '/
^host=(?<!\.)([\d.]+)(?!\.)                 (?#主机地址)
\|
([\w!@#$%^&*()_+\-]+)                       (?#用户名)
\|
([\w!@#$%^&*()_+\-]+)                       (?#密码)
(?!\|)$/ix';
$str = 'host=192.168.10.221|root|123456';
$matches = array();
if(preg_match($regex, $str, $matches)){
var_dump($matches);
}


 

8.特殊字符

特殊字符 解释
*        0到多次
+        1到多次还可以写成{1,}
?        0或1次
.        匹配除换行符外的所有单个的字符
\w        [a-zA-Z0-9_]
\s        空白字符(空格,换行符,回车符)[\t\n\r]
\d        [0-9]


 

[原] http://www.cnblogs.com/baochuan/archive/2012/03/12/2391135.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-349730-1-1.html 上篇帖子: php安装配置 下篇帖子: PHP多态
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表