@@ -92,6 +92,7 @@ let jsDelivr = istrue(queryObject.jsDelivr) //开启jsDelivr
9292let localText = queryObject . localtext != undefined ? '\n' + queryObject . localtext : '' //纯文本输入
9393let ipNoResolve = istrue ( queryObject . nore ) //ip规则不解析域名
9494let sni = queryObject . sni != undefined ? getArgArr ( queryObject . sni ) : null //sni嗅探
95+ let pm = queryObject . pm != undefined ? getArgArr ( queryObject . pm ) : null // pre-matching
9596let sufkeepHeader = keepHeader == true ? '&keepHeader=true' : '' //用于保留header的后缀
9697let sufjsDelivr = jsDelivr == true ? '&jsDelivr=true' : '' //用于开启jsDeliver的后缀
9798
@@ -132,6 +133,7 @@ let name,
132133 ruletype ,
133134 rulenore ,
134135 rulesni ,
136+ rulepm ,
135137 rulePandV ,
136138 rulepolicy ,
137139 rulevalue ,
@@ -365,7 +367,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
365367 // 加入对逻辑规则的判断
366368 if (
367369 x . indexOf ( elem ) != - 1 &&
368- ( / ^ ( D O M A I N | R U L E - S E T ) / i. test ( x ) || / A N D | O R | N O T \s * \? \s * ?\, \s * ?\( \s * ?\( . + / i. test ( x ) ) &&
370+ ( / ^ ( D O M A I N | R U L E - S E T ) / i. test ( x ) || / ( A N D | O R | N O T ) \s * ? , \s * ?\( \s * ?\( \s * ?. + \s * ? \) / i. test ( x ) ) &&
369371 ! / , \s * e x t e n d e d - m a t c h i n g / i. test ( x )
370372 ) {
371373 x = x + ',extended-matching'
@@ -374,6 +376,25 @@ if (binaryInfo != null && binaryInfo.length > 0) {
374376 } //循环结束
375377 } //启用sni嗅探结束
376378
379+ // pre-matching
380+ if ( pm != null ) {
381+ for ( let i = 0 ; i < pm . length ; i ++ ) {
382+ const elem = pm [ i ] . trim ( )
383+ // 加入对逻辑规则的判断
384+ if (
385+ x . indexOf ( elem ) != - 1 &&
386+ ( / ^ ( D O M A I N | D O M A I N | D O M A I N - S U F F I X | D O M A I N - K E Y W O R D | D O M A I N - S E T | D O M A I N - W I L D C A R D | I P - C I D R | I P - C I D R 6 | G E O I P | I P - A S N | S U B N E T | D E S T - P O R T | S R C - P O R T | S R C - I P | R U L E - S E T ) \s * ?, / i. test (
387+ x
388+ ) ||
389+ / ( A N D | O R | N O T ) \s * ?, \s * ?\( \s * ?\( \s * ?.+ \s * ?\) / i. test ( x ) ) &&
390+ ! / , \s * p r e - m a t c h i n g / i. test ( x )
391+ ) {
392+ x = x + ',pre-matching'
393+ break
394+ }
395+ } //循环结束
396+ } //启用 pre-matching 结束
397+
377398 //ip规则不解析域名
378399 if ( ipNoResolve == true ) {
379400 if ( / ^ (?: i p - [ c a ] | R U L E - S E T ) / i. test ( x ) && ! / , \s * n o - r e s o l v e / . test ( x ) ) {
@@ -506,7 +527,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
506527
507528 //rule解析
508529 if (
509- / ^ # ? (?: d o m a i n (?: - s u f f i x | - k e y w o r d | - w i l d c a r d | - s e t ) ? | i p - c i d r 6 ? | i p - a s n | r u l e - s e t | u s e r - a g e n t | u r l - r e g e x | ( d e ? s t | i n | s r c ) - p o r t | a n d | n o t | o r | p r o t o c o l ) \s * , .+ / i. test (
530+ / ^ # ? (?: d o m a i n (?: - s u f f i x | - k e y w o r d | - w i l d c a r d | - s e t ) ? | i p - c i d r 6 ? | i p - a s n | g e o i p | r u l e - s e t | u s e r - a g e n t | u r l - r e g e x | ( d e ? s t | i n | s r c ) - p o r t | s r c - i p | a n d | n o t | o r | p r o t o c o l | s u b n e t ) \s * , .+ / i. test (
510531 x
511532 )
512533 ) {
@@ -515,11 +536,13 @@ if (binaryInfo != null && binaryInfo.length > 0) {
515536 ruletype = x . split ( / \s * , \s * / ) [ 0 ] . replace ( / ^ # / , '' )
516537 rulenore = / , \s * n o - r e s o l v e / . test ( x ) ? ',no-resolve' : ''
517538 rulesni = / , \s * e x t e n d e d - m a t c h i n g / . test ( x ) ? ',extended-matching' : ''
539+ rulepm = / , \s * p r e - m a t c h i n g / . test ( x ) ? ',pre-matching' : ''
518540 rulePandV = x
519541 . replace ( / ^ # / , '' )
520542 . replace ( ruletype , '' )
521543 . replace ( / \s * , \s * n o - r e s o l v e / , '' )
522544 . replace ( / \s * , \s * e x t e n d e d - m a t c h i n g / , '' )
545+ . replace ( / \s * , \s * p r e - m a t c h i n g / , '' )
523546 . replace ( / ^ \s * , \s * / , '' )
524547 rulepolicy = getPolicy ( rulePandV )
525548 rulevalue = rulePandV
@@ -533,7 +556,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
533556 } else {
534557 modistatus = 'no'
535558 }
536- ruleBox . push ( { mark, noteK, ruletype, rulevalue, rulepolicy, rulenore, rulesni, ori : x , modistatus } )
559+ ruleBox . push ( { mark, noteK, ruletype, rulevalue, rulepolicy, rulenore, rulesni, rulepm , ori : x , modistatus } )
537560 } //rule解析结束
538561
539562 //host解析
@@ -899,6 +922,16 @@ if (binaryInfo != null && binaryInfo.length > 0) {
899922 rulenore = ruleBox [ i ] . rulenore ? ruleBox [ i ] . rulenore : ''
900923 rulesni = ruleBox [ i ] . rulesni ? ruleBox [ i ] . rulesni : ''
901924 rulesni = isLooniOS || isStashiOS ? '' : rulesni
925+ rulepm = ruleBox [ i ] . rulepm ? ruleBox [ i ] . rulepm : ''
926+ rulepm = isLooniOS || isStashiOS ? '' : rulepm
927+ if (
928+ ! / ^ ( D O M A I N | D O M A I N - S U F F I X | D O M A I N - K E Y W O R D | D O M A I N - S E T | D O M A I N - W I L D C A R D | I P - C I D R | I P - C I D R 6 | G E O I P | I P - A S N | A N D | O R | N O T | S U B N E T | D E S T - P O R T | S R C - P O R T | S R C - I P | R U L E - S E T ) $ / i. test (
929+ ruletype
930+ ) &&
931+ isSurgeiOS
932+ ) {
933+ rulepm = ''
934+ }
902935 modistatus = ruleBox [ i ] . modistatus
903936 ori = ruleBox [ i ] . ori
904937 if ( / d e ? s t - p o r t / i. test ( ruletype ) ) {
@@ -919,31 +952,32 @@ if (binaryInfo != null && binaryInfo.length > 0) {
919952 if ( / r e j e c t - [ ^ - ] + - n o - d r o p / i. test ( rulepolicy ) && ! isLooniOS ) {
920953 rulepolicy = rulepolicy . replace ( / - n o - d r o p / i, '' )
921954 }
922-
923955 if ( rulepolicy == '' ) {
924956 notBuildInPolicy . push ( ori )
925957 } else if ( / ^ p r o x y $ / i. test ( rulepolicy ) && modistatus == 'no' && ( isSurgeiOS || isStashiOS ) ) {
926958 notBuildInPolicy . push ( ori )
927959 } else if ( ! policyRegex . test ( rulepolicy ) && ! / ^ p r o x y $ / i. test ( rulepolicy ) && modistatus == 'no' ) {
928960 notBuildInPolicy . push ( ori )
929961 } else if ( / ^ i n - p o r t | d o m a i n - w i l d c a r d $ / i. test ( ruletype ) && isSurgeiOS ) {
930- rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni )
962+ rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm )
931963 } else if ( / ^ p r o t o c o l $ / i. test ( ruletype ) && ( isLooniOS || isSurgeiOS ) ) {
932964 rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore )
933965 } else if ( / ^ (?: d o m a i n - s e t | r u l e - s e t ) $ / i. test ( ruletype ) && ( isSurgeiOS || isShadowrocket ) ) {
934- rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni )
966+ rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm )
935967 } else if (
936- / ^ (?: d o m a i n ( - s u f f i x | - k e y w o r d ) ? | i p ( - a s n | - c i d r 6 ? ) | u s e r - a g e n t | u r l - r e g e x | d e ? s t - p o r t ) $ / i. test ( ruletype ) &&
968+ / ^ (?: d o m a i n ( - s u f f i x | - k e y w o r d ) ? | i p ( - a s n | - c i d r 6 ? ) | g e o i p | u s e r - a g e n t | u r l - r e g e x | d e ? s t - p o r t ) $ / i. test ( ruletype ) &&
937969 ! isStashiOS
938970 ) {
939971 rulevalue = / , / . test ( rulevalue ) && ! / [ ( ) ] / . test ( rulevalue ) ? '"' + rulevalue + '"' : rulevalue
940- rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni )
972+ rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore + rulesni + rulepm )
941973 } else if ( / ^ (?: a n d | o r | n o t ) $ / i. test ( ruletype ) && ! isStashiOS ) {
942974 rules . push ( ori )
943975 } else if ( / (?: ^ d o m a i n $ | d o m a i n - s u f f i x | d o m a i n - k e y w o r d | i p - | d e ? s t - p o r t ) / i. test ( ruletype ) && isStashiOS ) {
944976 rules . push ( mark + noteK2 + '- ' + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore )
945977 } else if ( / s r c - p o r t / i. test ( ruletype ) && ( isSurgeiOS || isLooniOS ) ) {
946- rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy )
978+ rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulepm )
979+ } else if ( / s r c - i p | s u b n e t / i. test ( ruletype ) && isSurgeiOS ) {
980+ rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulepm )
947981 } else if ( / u r l - r e g e x / i. test ( ruletype ) && isStashiOS && / r e j e c t / i. test ( rulepolicy ) ) {
948982 let Urx2Reject
949983 if ( / D I C T / i. test ( rulepolicy ) ) {
0 commit comments