2015-08-04 24 views
18

Il GreaseSpot page on metadata blocks dice che i due sono molto simili ma @match "imposta regole più rigide su cosa significhi il carattere *". GreaseSpot procede quindi a teach utilizzando @include, ma gli esempi di Chrome come this in genere sembrano utilizzare @match e indicano che @include è supportato solo per scopi di compatibilità; @match è preferito.Qual è la differenza tra @include e @match in userscripts?

Apparently, @include google.* può essere eseguito su google.evil.com mentre @match google.* non può.
Questo esempio non è sufficiente per vedere realmente come i caratteri jolly si comportano in modo diverso tra questi due, e in questo caso si cercano spiegazioni migliori nelle risposte.

Nuovi script GreaseMonkey (Firefox) utilizzano @include per impostazione predefinita mentre i nuovi script di TamperMonkey (ad esempio Chrome) utilizzano @match per impostazione predefinita.

Quali sono esattamente le differenze tra questi due?

Ad esempio, in che modo ciascuno gestisce i caratteri jolly?
Ci sono differenze nella compatibilità cross-browser?
Quali motivi dovrebbe avere qualcuno per scegliere di usarne uno sull'altro?

+0

Basta usare include come tutti gli altri. Lo faccio da anni e non ho avuto problemi. – MortenMoulder

risposta

10

Non è possibile utilizzare le espressioni regolari con @match, mentre si è can con @include.

Tuttavia, @include fornirà agli utenti avvisi di sicurezza più scarsi sullo script che si applica a tutti i siti.

Questo è anche se l'espressione @include ti permette di essere più restrittivo sui siti uno script riferisce (ad esempio, specificando che parte di un URL sia numerico utilizzando il frammento di espressione regolare "[0-9] +", o usando "^ https?: //" per applicare a uno script solo questi due schemi, invece del più generale operatore di non regex globbing * usato per ciascuno di quei casi in @match, che fa sì che lo script si applichi più ampiamente) .

+2

Un esempio in cui il carattere jolly '@ match' è più sicuro del jolly' @ include' può essere trovato in [Tampermonkey forum] (https://forum.tampermonkey.net/viewtopic.php?t=466): '@include http * : // *. biniok.net' consente http: //evil.de#biniok.net, '@match http *: // *. biniok.net' no. –

+0

@FranklinYu Non è questo solo perché il '@ include' è interpretato come un'espressione regolare, e questa particolare regex consente esplicitamente evil.de # biniok.net? '/ *' significa "zero o più'/'caratteri", mentre '.' che segue significa" qualsiasi carattere ". Cambiarlo in '@include^https?: //.*biniok \ .net $' lo renderebbe sicuro. – dkasak

+0

@dkasak '@include http *: // *. Biniok.net' viene interpretato come glob. Per essere interpretato come espressione regolare, dovrebbe essere '@include/http *: // *. Biniok.net /'. Inoltre, '@include/http *: // *. Biniok.net /' non corrisponde a http://evil.de/#biniok.net; corrisponde a qualcosa come 'htt:/1biniok2net' o' httppppp: ////// xbiniokynet' –