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}?>



 

与正则相关的几个php函数

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]);

原创粉丝点击