技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> PHP 正则里面的两个重要技巧

PHP 正则里面的两个重要技巧

浏览:3340次  出处信息

正则用了好些年,有两个东西总结出来是在web开发中非常有用的,尤其在抓取、代码分析中经常用到。

1. .* 的贪吃性

我们用 /\*.*\*/ 去和字符串 /* first comment */ not comment /* second comment */ 匹配会失败,因为由于 .* 项目的贪吃性,会匹配成整个字符串,于是就会匹配失败,不过,如果在后面加一个问号数量符,则会停止贪吃性,而变成匹配尽可能少的数目,因此模式 /\*.*?\*/ 就会正确匹配。各种数量符的含义并没有改变,只是优先的匹配数目。不要将问号的此用法和其自己作为数量符的使用混淆。因为有两种用法,有时可以两个一起出现,例如 \d??\d 会优先匹配一个数字,但如别无选择也可以匹配两个以使剩余模式匹配。

如果设定了 PCRE_UNGREEDY 选项(此选项 Perl 中没有)则数量符默认不是贪吃型的,但是在个别模式后加上一个问号可以将其变成贪吃型的。换句话说,这可以反转默认的行为。

后面跟上一个 + 的数量符是“占有性”(possessive)的。它会匹配尽可能多的字符而不管剩余的模式。因此 .*abc 可以匹配 “aabc” 但是 .*+abc 就不会,因为 .*+ 已经匹配了整个字符串。自 PHP 4.3.3 起可以用占有性数量符可以来加快处理过程。

2. ()子模式的不捕获

如果将字符串 “the red king” 来和模式 the ((red|white) (king|queen))
进行匹配,捕获的子串为 “red king”,”red” 以及 “king”,并被计为 1,2 和 3。

简单的括号实现两种功能的事实不总是有帮助的。经常有需要一组子模式但不需要捕获的时候。如果左括号后面跟着 “?:”,子模式不做任何捕获,并且在计算任何之后捕获的子模式时也不算在内。例如,如果用字符串 “the white queen” 去和模式 the ((?:red|white) (king|queen)) 匹配,捕获的子串是 “white queen” 和 “queen”,并被计为 1 和 2。

因此,最完美的匹配网页中图片 src 部分的正则表达式处理如下:

$str='<p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="upfiles/2009/07/1246430143_4.jpg" alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src=\'upfiles/2009/07/1246430143_3.jpg\' alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="upfiles/2009/07/1246430143_1.jpg" alt=""/><img width="280" height="187" alt="" class="imgloading" original="http://s.yoututuan.com/team/2011/1206/13231497847660.jpg" src="http://s.yoututuan.com/team/2011/1206/13231497847660.jpg" style="display: block; ">';
 
$pattern="/<img.*?src=['|\"](.*?(?:\.(?:gif|jpg)))['|\"].*?[\/]?>/i";
preg_match_all($pattern,$str,$match);
 
print_r($match);

以上代码将输出如下内容:

Array
(
    [0] => Array
        (
            [0] => <img border="0" src="upfiles/2009/07/1246430143_4.jpg" alt=""/>
            [1] => <img border="0" src='upfiles/2009/07/1246430143_3.jpg' alt=""/>
            [2] => <img border="0" src="upfiles/2009/07/1246430143_1.jpg" alt=""/>
            [3] => <img width="280" height="187" alt="" class="imgloading" original="http://s.yoututuan.com/team/2011/1206/13231497847660.jpg" src="http://s.yoututuan.com/team/2011/1206/13231497847660.jpg" style="display: block; ">
        )

    [1] => Array
        (
            [0] => upfiles/2009/07/1246430143_4.jpg
            [1] => upfiles/2009/07/1246430143_3.jpg
            [2] => upfiles/2009/07/1246430143_1.jpg
            [3] => http://s.yoututuan.com/team/2011/1206/13231497847660.jpg
        )

)

建议继续学习:

  1. 统计最近用过的linux命令    (阅读:5207)
  2. grep 正则表达式选项要记得转义    (阅读:5075)
  3. 正则表达式基础    (阅读:4922)
  4. 正则表达式的与或非    (阅读:4575)
  5. 学习Grep,Sed中的正则    (阅读:3899)
  6. URL正则表达式    (阅读:3469)
  7. 正则表达式简要入门    (阅读:3352)
  8. 正则表达式简介及使用    (阅读:3178)
  9. 正则转义符汇总    (阅读:3184)
  10. 正则表达式傻瓜书 第二章:元字符    (阅读:3075)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1