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#测试 )



正则排除指定字符串 python_正则