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 );
我的 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 );