【问题标题】:PHP - preg_replace() pattern not work correctlyPHP - preg_replace() 模式无法正常工作
【发布时间】:2020-09-02 15:35:28
【问题描述】:

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

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

"||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( '/\|\|([^\^\$=,]+).*/', '*://*.$1/*', $file ); 
    }
    
    return explode( "\n", self::$parsed );
  }

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

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

我该如何解决这个问题?

【问题讨论】:

  • 请不要张贴图片,只需将文字放在之前和之后。
  • ([^\^\$=,]+) 匹配任何不是^$=, 的字符,因此它匹配第1 组中的clickbank.net/offer_id"
  • 好的,但是如果我删除^,则其他行的替换可以正常工作,如果我删除^,输出将不会按预期格式化。如何解决这两个问题?
  • 我们无法回答没有示例文件预期结果,文本,而不是图像。
  • @Toto 预期的输出已经在问题"*://*.clickbank.net/*" 中。我将更新问题以添加所需的文本。

标签: php regex preg-replace


【解决方案1】:

这一行:

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

不像你想象的那样工作。

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

改用这个:

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

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

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

【讨论】:

  • @miko:您的实际正则表达式应该可以工作,只需删除! 之前的转义即可。一个问题:引号是字符串的一部分吗?
  • 测试了你的模式,但是文件处理后我得到了一个空数组。
  • 示例代码是输出数组的一部分,不是从方法解析的字符串的一部分
  • ! 之前删除转义符并不能解决问题,现在测试了它的行仍然存在
  • 我会看到它,但我不能应用该模式来替换旧模式,因为这会给我一个空白数组作为输出。此外,!comment 行仍然可用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多