php排除型正则表达式—— 一般排除法 及 断言(前后瞻断言)的方式排除
(被查找的内容都是多行跨行的情况)
 
关于断言请翻阅
php手册 · 在索引输入: preg_xxx · 进入某函数后 · 点击顶部导航的  PCRE正则语法  · 子组/断言 
阅读更多内容.
 
       (下面所有例子中的#...# , ##仅仅表示使用正则时的一对闭合的分隔符 定界符号,ending delimiter .)
 
 
1. 使用一般排除的方法
要求查找到所有的html注释标签<!-- ... -->  ,
但排除script脚本和style样式内的注释符<!-- ......  //-->
的正则表达式
 
代码如下:
<?php
    $str = '...'; // 请自行输入带html注释的字符串进行测试.
 
    $patten_comm = '#<!--[^(?://\-\->)]*?-->#'; // 已排除js或style脚本样式标签内的注释,测试符合要求(也符合换行的情况)
 
    preg_match_all( $patten_comm , $str , $res );
    echo '<pre>';var_dump( $res );echo '</pre>';
?>
 
 
 
该正则其中的 (?:) 表示对内容进行分组(表示作为一个整体, 或称为模组) ,但不要捕获它们。它跟小括号()的区别是,不能像
小括号()那样通过在表达式中写上 \1  的方式, 引用括号里面的内容.  就是说只匹配,不捕获.   现在我们使用[^(?://-->)] 就表示排除 //-->  , 但由于"-"杠号在中括号内有歧义,所以要用\转义,于是改成: //\-\->   这样整个正则表达式就排除了<!-- ...  //-->, 而获取到了正确的结果。       2. 使用前瞻断言 排除 “前瞻断言”以符号(?!abc)进行声明, 其中在括号里面写上 (?!这里写上被排除的正则表达式) 的方式进行排除.   举例1: 排除以xxx为前缀的情况.     php手册上举例的是 (?!abc)ddd 排除前面是abc的情况,我们用实际应用举例:   要求: 查找字符串中的php变量$abc,但排除前面是转义符的情况—— \$abc 对应正则:  #(?!\\)\$[a-zA-Z_][a-zA-Z0-9_\-]#     举例2: 排除以xxx为结尾(后缀)的情况.    在日志文件中,一般每行作为一条记录,我们要列出所有的  以行为单位的日志,但不要包括那些机器人的情况,即排除以robots结尾的情况。(此例子系引用他人)   对应正则:  ^(?!.*?robots).*$ 该正则通过排除整个 .*robots 的方式,以达到排除以robots结尾的情况,而同时又能捕获那些不是robots结尾的文本。       3. 使用 后瞻断言 排除   后瞻断言是以  (?>! 排除内容)   为声明表示. php手册上的例子是:    (?<!foo)bar         用于查找任何前面不是”foo”的”bar”.   后瞻断言的内容,被严格限制为只能使用固定长度的字符串. 也就是不能是 (?<!end.*)  这种任意长度的, 必须是固定的, 否则php会报这个错误:Compilation failed: lookbehind assertion is not fixed length  。   后瞻断言本人使用不多,就不详述了。 


例子:
要求:匹配除了  <a>标签之内的,所有"test"字符 
   aaaaatestaaa<a href="test" class="aaaaa" title="oooo">aatestaaaaaa</a>aaaatestaaaa


正则表达式:(?<!<[^>]*)test(?![^<]*</a>)
结果:( C#测试 )

 

posted on 2013-05-14 18:08  王奇疏  阅读(4364)  评论(0编辑  收藏  举报