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