@@ -92,6 +92,7 @@ let jsDelivr = istrue(queryObject.jsDelivr) //开启jsDelivr
92
92
let localText = queryObject . localtext != undefined ? '\n' + queryObject . localtext : '' //纯文本输入
93
93
let ipNoResolve = istrue ( queryObject . nore ) //ip规则不解析域名
94
94
let sni = queryObject . sni != undefined ? getArgArr ( queryObject . sni ) : null //sni嗅探
95
+ let pm = queryObject . pm != undefined ? getArgArr ( queryObject . pm ) : null // pre-matching
95
96
let sufkeepHeader = keepHeader == true ? '&keepHeader=true' : '' //用于保留header的后缀
96
97
let sufjsDelivr = jsDelivr == true ? '&jsDelivr=true' : '' //用于开启jsDeliver的后缀
97
98
@@ -132,6 +133,7 @@ let name,
132
133
ruletype ,
133
134
rulenore ,
134
135
rulesni ,
136
+ rulepm ,
135
137
rulePandV ,
136
138
rulepolicy ,
137
139
rulevalue ,
@@ -365,7 +367,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
365
367
// 加入对逻辑规则的判断
366
368
if (
367
369
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 ) ) &&
369
371
! / , \s * e x t e n d e d - m a t c h i n g / i. test ( x )
370
372
) {
371
373
x = x + ',extended-matching'
@@ -374,6 +376,25 @@ if (binaryInfo != null && binaryInfo.length > 0) {
374
376
} //循环结束
375
377
} //启用sni嗅探结束
376
378
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
+
377
398
//ip规则不解析域名
378
399
if ( ipNoResolve == true ) {
379
400
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) {
506
527
507
528
//rule解析
508
529
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 (
510
531
x
511
532
)
512
533
) {
@@ -515,11 +536,13 @@ if (binaryInfo != null && binaryInfo.length > 0) {
515
536
ruletype = x . split ( / \s * , \s * / ) [ 0 ] . replace ( / ^ # / , '' )
516
537
rulenore = / , \s * n o - r e s o l v e / . test ( x ) ? ',no-resolve' : ''
517
538
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' : ''
518
540
rulePandV = x
519
541
. replace ( / ^ # / , '' )
520
542
. replace ( ruletype , '' )
521
543
. replace ( / \s * , \s * n o - r e s o l v e / , '' )
522
544
. 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 / , '' )
523
546
. replace ( / ^ \s * , \s * / , '' )
524
547
rulepolicy = getPolicy ( rulePandV )
525
548
rulevalue = rulePandV
@@ -533,7 +556,7 @@ if (binaryInfo != null && binaryInfo.length > 0) {
533
556
} else {
534
557
modistatus = 'no'
535
558
}
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 } )
537
560
} //rule解析结束
538
561
539
562
//host解析
@@ -899,6 +922,16 @@ if (binaryInfo != null && binaryInfo.length > 0) {
899
922
rulenore = ruleBox [ i ] . rulenore ? ruleBox [ i ] . rulenore : ''
900
923
rulesni = ruleBox [ i ] . rulesni ? ruleBox [ i ] . rulesni : ''
901
924
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
+ }
902
935
modistatus = ruleBox [ i ] . modistatus
903
936
ori = ruleBox [ i ] . ori
904
937
if ( / d e ? s t - p o r t / i. test ( ruletype ) ) {
@@ -919,31 +952,32 @@ if (binaryInfo != null && binaryInfo.length > 0) {
919
952
if ( / r e j e c t - [ ^ - ] + - n o - d r o p / i. test ( rulepolicy ) && ! isLooniOS ) {
920
953
rulepolicy = rulepolicy . replace ( / - n o - d r o p / i, '' )
921
954
}
922
-
923
955
if ( rulepolicy == '' ) {
924
956
notBuildInPolicy . push ( ori )
925
957
} else if ( / ^ p r o x y $ / i. test ( rulepolicy ) && modistatus == 'no' && ( isSurgeiOS || isStashiOS ) ) {
926
958
notBuildInPolicy . push ( ori )
927
959
} else if ( ! policyRegex . test ( rulepolicy ) && ! / ^ p r o x y $ / i. test ( rulepolicy ) && modistatus == 'no' ) {
928
960
notBuildInPolicy . push ( ori )
929
961
} 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 )
931
963
} else if ( / ^ p r o t o c o l $ / i. test ( ruletype ) && ( isLooniOS || isSurgeiOS ) ) {
932
964
rules . push ( mark + noteK + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore )
933
965
} 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 )
935
967
} 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 ) &&
937
969
! isStashiOS
938
970
) {
939
971
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 )
941
973
} else if ( / ^ (?: a n d | o r | n o t ) $ / i. test ( ruletype ) && ! isStashiOS ) {
942
974
rules . push ( ori )
943
975
} 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 ) {
944
976
rules . push ( mark + noteK2 + '- ' + ruletype + ',' + rulevalue + ',' + rulepolicy + rulenore )
945
977
} 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 )
947
981
} else if ( / u r l - r e g e x / i. test ( ruletype ) && isStashiOS && / r e j e c t / i. test ( rulepolicy ) ) {
948
982
let Urx2Reject
949
983
if ( / D I C T / i. test ( rulepolicy ) ) {
0 commit comments