PHP - preg_replace() 模式无法正常工作

PHP - preg_replace() pattern not work correctly

我的 php class 中有一个正则表达式,用于从远程文件中删除一些不需要的字符。 我遇到正则表达式根本不起作用的问题,我注意到字符仍然存在于已解析文件的某些位置。

这是文件中不会被解析的部分(它是数组的一部分)

"||clickbank.net/*offer_id=$popup,third-party"
"! IP addresses"
"||130.211.$popup,third-party,domain=~in-addr.arpa"
"||142.91.$popup,third-party,domain=~in-addr.arpa"
"||185.147.34.126^$popup,third-party"
"||216.21.13.$popup,domain=~in-addr.arpa"
"||35.232.188.118^$popup"
"||5.45.79.15^$popup"
"! IP Regex (commonly used, hax'd IP addresses)"
"/^https?:\/\/(35|104)\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}\//$popup,third-party"
""

这是预期的输出是

"*://*.clickbank.net/*"
"://130.211.*/*"
"://142.91.*/*"
"://185.147.34.126/*"
"://216.21.13/*"
"://35.232.188.118/*"
"*://5.45.79.15/*"

这是代码:

  private static function parseFilterLists( $filters )
  {
    foreach( $filters as $filter ){
      $file =  file_get_contents( $filter );
      self::$parsed = preg_replace( '/\!.*/', '', $file );
      self::$parsed = preg_replace( '/\|\|([^\^$=,]+).*/', '*://*./*', $file ); 
    }
    
    return explode( "\n", self::$parsed );
  }

我要删除的行开头有 ! 字符,我还需要从数组中删除最后两行,因为一行是空的,另一行是正则表达式模式,但这不是必需的我的范围。 其他具有 ! 字符的行使用 preg_replace() 从函数中正确处理并被删除。

另外class的方法在解析输入文件时,有一些行不会被正确处理,例如这个输入行||clickbank.net/offer_id"应该变成"*://*.clickbank.net/*" 但是会这样处理返回"*://*.clickbank.net/*offer_id/*"

我该如何解决这个问题?

这一行:

self::$parsed = preg_replace( '/\|\|([^\^$=,]+).*/', '*://*./*', $file ); 

并不像你想象的那样有效。

  • ([^\^$=,]+) 在组 1 中存储 1 个或多个不是 ^$=, 的任何字符。因此,应用于 clickbank.net/offer_id" 组 1 将包含整场比赛:clickbank.net/offer_id".

改用这个:

self::$parsed = preg_replace('~\|\|([^/^$]+).*~', '*://*./*', $file ); 

此外,您的两行代码正在替换相同的字符串 $file 并将结果存储在 $parse 中,因此第一次替换丢失了,您必须对结果进行第二次替换第一个替换,例如:

self::$parsed = preg_replace( '/!.*/', '', $file );
self::$parsed = preg_replace( '~\|\|([^/^$]+).*~', '*://*./*', self::$parsed );