通用网页广告监测,ADBlock plus算法的C#实现。

最近接到一个需求:随便给一个网页,要求检测出里面的广告。

看到这需求,第一时间想到了firefox中的adblock plus,adblock plus是基于规则包来过滤广告,里面的广告描述规则也许能拿来用。于是折腾了一晚上,实现了一个简单的东西来满足需求,效果还不错

adblock plus工作原理:

 

adblock plus是先把过滤规则全部转换成正则表达式。再用这些正则表达式去过滤广告。

 

我思路如下:

1.实现一个adblock plus规则解析器,把adblock plus的广告过滤规则 转换成正则表达式。

2.得到一个要检测广告的页面后,解析出这个页面的所有链接。遍历所有链接,应用第一步得到的正则表达式规则判断链接是否广告。

 

第一步基于对正则表达式的理解简单的实现了下,如"."转换成"\\.","*"转换成".*"等,元素隐藏规则暂时不处理。adblock plus规则说明:http://code.google.com/p/adblock-chinalist/wiki/Writing_Adblock_Plus_filters

 

第二步,(adblock plus详细的匹配算法:http://adblockplus.org/blog/investigating-filter-matching-algorithms)经过第一步处理后,得到了几千条广告过滤正则表达式。 怎么解析出一个页面的所有链接就不说了,到这里时,收到有一大堆有待判断的链接,和一大堆用于判断的正则表达式规则,普通的思路是对于每一条链接,遍历所有规则判断是否匹配,代码如下:

function  getMatchingFilter1(S, F)
  
for  each filter  in  F
    
if  (filter matches S)
      
return  filter
    end 
if
  end 
for
  
return   null
end 
function
 

 

但这样效率惨不忍睹。还好adblock plus中给出了一个不错的解决方案,对每一条过滤规则抽取出一个代表这条过滤规则的唯一key值,把这些放在哈希表中。于是对一条链接的判断不用遍历所有的规则,而是先在哈希表中查找出有可能匹配的规则再匹配。

对于查找出有可能 匹配的规则,adblock中用来一个奇妙的算法:Boyer-Moore algorithm

adblock plus中实现如下:

function  initializeHashTable3(H, J, C, m)
  
for  each c  in  C
    H(c) :
=  filter(c)
    
for  i  in  ( 0  .. m / 2)
      substring : =  c.substring(i, m / 2)
      jump : =  m / 2 - i
       if  substring not  in  J or J(substring)  >  jump
        J(substring) :
=  jump
      end 
if
    end 
for
  end 
for
end 
function

function  getMatchingFilter3(S, H, J, m)
  endPtr :
=  m
  
while  endPtr  <=  n
    substring :
=  S.substring(endPtr  -  m / 2, m / 2 )
    
if  substring  in  J and J[substring]  >   0
      endPtr :
=  endPtr  +  J[substring]
    
else   if  substring  in  J and J[substring]  =   0
      substring :
=  S.substring(endPtr  -  m, m)
      
if  (substring  in  H and H(substring) matches S)
        
return  H(substring)
      
else
        endPtr :
=  endPtr  +   1
      end 
if
    
else
      endPtr :
=  endPtr  +  m / 2 + 1
    end  if
  end 
while

  
return   null
end 
function

其中参数说明:

H是存放每一天规则生成的唯一key的哈希表,value是这条规则。
J存放的是跳过多少位字符的信息,Boyer-Moore算法要用到的。
C是是存放每一天规则生成的唯一key的集合。
M是每一条规则生成的key的长度,是8,没为什么。
S是要判断的链接。

我的实现就是,蹬蹬蹬蹬,就是翻译成C#版本:
public   void  InitializeHashTable(Dictionary < string string >  H, Dictionary < string int >  J, List < string [] >  C)
{
    foreach  ( string [] kv  in  C)
    {
        string  key  =  kv[ 0 ];
        string  ruleText  =  kv[ 1 ];
        if  ( ! H.ContainsKey(key))
        {
            H.Add(key, ruleText);
        }

       
for  ( int  i  =   0 ; i  <=   4 ; i ++ )
        {
           
int  jump  =   4   -  i;
           
string  childKey  =  key.Substring(i,  4 );
           
if  ( ! J.ContainsKey(childKey)  ||  J[childKey]  >  jump)
            {
                J[childKey] 
=  jump;
            }
        }
    }
}

private   string  GetMatchingFilter( string  url,Dictionary < string string > H, Dictionary < string int > J)
{
    int  endPtr  =   8 ;
   
while  (endPtr  <=  url.Length)
    {
       
string  key  =  url.Substring(endPtr  -   4 4 );

       
if  (J.ContainsKey(key)  && J[key]  >   0 )
        {
            endPtr 
+= J[key];
        }
       
else   if  (J.ContainsKey(key)  && J[key]  ==   0 )
        {
            key 
=  url.Substring(endPtr  -   8 8 );

           
if  (H.ContainsKey(key)  &&  Regex.IsMatch(url, H[key], options))
            {
               
return H[key];
            }
           
else
            {
                endPtr
++ ;
            }
        }
       
else
        {
            endPtr 
=  endPtr  +   5 ;
        }
    }

   
return   null ;
}
完成,求交流。文中所用到的资料:

 

 

 

 

 


 

转载于:https://www.cnblogs.com/pwg17/archive/2011/02/27/1966318.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Adblock Plus Premium是Adblock Plus(广告拦截软件)的高级版本。Adblock Plus是一款广告拦截软件,可以阻止网页和应用程序中显示的大多数广告。它通过过滤掉广告脚本和元素,提供更好的浏览体验。Adblock Plus Premium提供了更多功能和特性,以进一步提升用户的浏览体验。 Adblock Plus Premium的主要特点包括: 1. 广告拦截功能:与Adblock Plus相同,Adblock Plus Premium可以阻止网页和应用程序中的广告显示,为用户提供更干净、无干扰的浏览体验。 2. 更精确的广告过滤:Adblock Plus Premium提供更高级的广告过滤功能,可以更准确地识别和拦截各种类型的广告,包括弹出广告、悬浮广告、视频广告等。 3. 提供更多的自定义选项:Adblock Plus Premium允许用户根据自己的需求和喜好进行更精细的设置,如白名单管理、筛选规则设置等,以便更好地控制广告拦截。 4. 更快的页面加载速度:通过阻止广告加载,Adblock Plus Premium可以加快网页的加载速度,提供更快的浏览体验。 5. 优先支持和更好的技术支持:Adblock Plus Premium用户可以享受到优先的技术支持和帮助,以确保他们的使用体验始终保持在最佳状态。 总而言之,Adblock Plus Premium是一款更高级、更功能强大的广告拦截软件,可以为用户提供更好的浏览体验。通过阻止广告加载和提供更多的自定义选项,它可以减少浏览中的干扰,提高页面加载速度,并提供专业的技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值