php 正则 记一些自己想记的
来源:互联网 发布:冰点下载器 mac 编辑:程序博客网 时间:2024/05/19 17:10
正向预查(?=pattern)(?<=pattern)
反向预查(?!=pattern)(?<!pattern)
(?=pattern)
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。表示的后面必须有
一个例子 (?=pattern)
<?php $regex = '/iphone(?=3|4|5)\d/'; $str = 'iphone3 iphone4 iphone8'; if(preg_match_all($regex, $str, $matches)){ var_dump($matches); } ?>
打印出来
array 0 => array 0 => string 'iphone3' (length=7) 1 => string 'iphone4' (length=7)
还有一个例子(?<=pattern)
<?php $str = '<div class=aa name=wahaha>11111</div><div class=pp name=yoursister>11111</div><div class=aa name=cc>11111</div>'; $regex = '/(?<=class\=)aa\s*name=([a-z]*)/'; //打印 查找class为aa 的name if(preg_match_all($regex, $str, $matches)){ var_dump($matches[1]); }?>
打印出来
(?<=pattern)
负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用
一个例子
<?php$str = 'iphone 3000,samsung 4000,huawei 5000,moto 6000'; $regex = '/(^|,)(?!samsung)[a-z]+\s(\d+)/';//打印 查找除了samsung的所有价格if(preg_match_all($regex, $str, $matches)){var_dump($matches[2]);}?>
打印结果
array 0 => string '3000' (length=4) 1 => string '5000' (length=4) 2 => string '6000' (length=4)
(?<!pattern)
<?php$str = 'iphone5000,samsung5000,moto5000,huawei5000,xiaomi1000'; $regex = '/([a-z]+)(?<!samsung)5000/';//打印 查找价格5000非samsung的东东if(preg_match_all($regex, $str, $matches)){var_dump($matches[1]);}?>
打印
array 0 => string 'iphone' (length=6) 1 => string 'moto' (length=4) 2 => string 'huawei' (length=6)
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。当然,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部。
捕获组有两种形式,一种是普通捕获组,另一种是命名捕获组,通常所说的捕获组指的是普通捕获组。
一个简单的例子
<?php$str = '111111111111111'; $str1 = '12222222222'; $regex = '/^(\d)\1+$/';//匹配这个字符串的数字全是一样的preg_match_all($regex, $str, $matches);echo $matches[0][0]."<br>"; //能够匹配到preg_match_all($regex, $str1, $matches);echo empty($matches[0]); //不能够匹配到了?>
捕获是占内存的,有时候为了看的明白点会用括号,但是又不想占用内存,可以用非捕获
(?:pattern)
一个例子
<?php$str = '<div id="aaaa">qwewe</div>'; $regex = '/<div\s*(?:id=[\'\"][a-z]+[\'\"])>(.*?)<\/div>/';$regex1 = '/<div\s*(id=[\'\"][a-z]+[\'\"])>(.*?)<\/div>/';if(preg_match_all($regex, $str, $matches)){var_dump($matches[1]);//qwewe}if(preg_match_all($regex1, $str, $matches)){var_dump($matches[1]);//id="aaaa"}?>
命名捕获组
命名捕获组通过显式命名,可以通过组名方便的访问到指定的组,而不需要去一个个的数编号,同时避免了在正则表达式扩展过程中,捕获组的增加或减少对引用结果导致的不可控。
不过容易忽略的是,命名捕获组也参与了编号的,在只有命名捕获组的情况下,捕获组的编号也是按照“(”出现的顺序,从左到右,从1开始进行编号的 。
一个例子
<?php$str = '2012 12 31'; $regex = '/(?P<year>\d{4})\s*(?P<month>\d{2})\s*(?P<day>\d{2})/';if(preg_match_all($regex, $str, $matches)){var_dump($matches["year"]);//2012var_dump($matches["month"]);//12var_dump($matches["day"]);//31}?>
preg_quote
string preg_quote ( string $str [, string $delimiter ] )
以 str 为参数并给其中每个属于正则表达式语法的字符前面加上一个反斜线。
正则表达式的特殊字符包括:. \ + * ? [ ^ ] $ ( ) { } = ! < > | :
$patten = "\ + * ? [ ^ ] $ ( ) { } = ! < > | ";echo preg_quote($patten);//输出为 \\ \+ \* \? \[ \^ \] \$ \( \) \{ \} \= \! \< \> \|
preg_replace
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit ] )
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement 。如果指定了 limit ,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
replace强大的地方在支持反向引用,被捕获的东西可以用$n来获取, $0表示整体匹配的东西,$1表示第一个小括号里面的东西,$2就是第2个小括号里面的东西,依次类推.....。当让 替换是建立在正则匹配成功的基础上,匹配不成功不经行替换.
一些例子
$str = "aaaaaaaaaa";echo preg_replace("/bbb(c)/","$1",$str); //匹配失败 不经行替换
$str = "aa bb cc dd";echo preg_replace("/aa/","$0$0$0",$str);//aaaaaa bb cc dd//匹配成功 $0表示匹配整个内容 3个$0就是 3个aa 就打出了6个aa
$str = "c4444c223355bbbbbbb666";echo preg_replace("/(b)\d+/","$1",$str);//cc223355bbbbbbb//$1是匹配一个捕获组里面的东西,是b,然后整体匹配出的是b666,要替换成$1(就是b), 所以只有b后面的数字全部不见了
$str = '<a id="cc" class="xx">a</a><a href="#" class="xx">b</a><div class="vv"></div><a class=\'b\'>c</a><p class="bbbbb">d</p>';echo preg_replace("/(<a.*?class=)(['\"]).*?\\2/","$1\"T_T\"",$str);//把所有a 标签的class 替换成 T_T
preg_replace_callback
mixed preg_replace_callback ( mixed $pattern , callback $callback , mixed $subject [, int $limit ] )
用回调函数执行正则表达式的搜索和替换
本函数的行为几乎和 preg_replace() 一样,除了不是提供一个 replacement 参数,而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数,并返回用于替换的字符串。
回调函数只有一个参数 是个数组 比如是$matches $matches[0]是整体的匹配项,$matches[1]是第一个捕获组里面的东西.
这是一个好东西 对于一些特殊需要很有好处,比如说把 <div>里面的正数显示红色 ,负数显示绿色,0显示黑色
$str = "<div>123</div><div>-0.1</div><div>-23</div><div>0</div><div>0.1</div>";function cb($matches){$num = (float)$matches[1];if($num>0){$color = "#f00";}else if($num==0){$color = "#000";}else{$color = "#0F0";}return '<div style="color:'.$color.'">'.$matches[1].'</div>';}echo preg_replace_callback("/<div>(.*?)<\/div>/","cb",$str);
preg_match
int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )
进行正则表达式匹配。
在 subject 字符串中搜索与 pattern 给出的正则表达式相匹配的内容。
如果提供了 matches ,则其会被搜索的结果所填充。$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
preg_match返回1或者0,0表示不匹配.
一个字符串里面符合查找条件的可能很多, 但是preg_match只查找第一个.
$str = '<div class="xx">1111</div><span>xxx</span><div class="gg">ggg</div><div>xxx</div><div class="xx">222</div>';$patten = '/<div class="xx">(.*?)<\/div>/';print_r(preg_match($patten,$str,$matches));print_r($matches); //查找说有div class为xx的内容
preg_match_all
int preg_match_all ( string $pattern , string $subject , array $matches [, int $flags ] )
会搜索字符串中所有的匹配项
$matches[0]是整个的匹配项 是数组,$matches[1]是一个捕获的匹配项 是数组,一次类推........
preg_match_all返回的匹配项的数组的长度
$str = "<span>1111</span><span>2222</span><span><div>3333</div></span><span>4444444</span><p>555555</p><span>6666666</span>";$patten = '/<span>(.*?)<\/span>/';print_r(preg_match_all($patten,$str,$matches));print_r($matches[0]);print_r($matches[1]);
- php 正则 记一些自己想记的
- 自己用过的一些正则表达式
- 一些自己用到的正则表达式
- PHP一些资料自己整理的
- PHP一些常用的正则表达式
- PHP一些常用的正则表达式
- PHP,JS 一些常用的正则表达式
- PHP中一些正则表达式的应用
- PHP 文件、正则的一些简单操作
- php一些常用的正则表达式
- PHP常用的一些正则表达式
- PHP一些常用的正则表达式
- PHP一些常用的正则表达式
- PHP正则表达式的一些学习
- PHP中用到的一些正则
- 自己总结的一些正则表达式(c#版)
- 谈谈自己对正则化的一些理解~
- 自己摸索的一些使用中的html查找替换正则
- VB性能记录
- ecshop Undefined variable: data in 的问题处理方法
- TortoiseSVN Switch与Relocate的区别
- VC6.0下配置opencv1.0
- load一个数据文件
- php 正则 记一些自己想记的
- 复制来的幸福,始终粘贴不到自己身上:伤感日志
- Android 游戏开发之线程Thread延时开启和停止
- 欧几里德算法及其扩展算法
- 教育部首设儿童成长阶梯标准:4岁学会体谅父母
- Apache Hadoop 2.0-alpha发布
- linux exec用法总结
- ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
- kshell 如何比较两个数值或字符串 "test" [[ ]]" "(())" "[ ]"