2015-08-04 2 views
18

GreaseSpot page on metadata blocks говорит, что эти два очень похожи, но @match "устанавливает более строгие правила в отношении символа *". Затем GreaseSpot переходит к teach с использованием @include, но примеры Chrome, такие как this, как правило, используют @match и указывают, что @include поддерживается только в целях совместимости; @match.В чем разница между @include и @match в пользовательских сценариях?

Apparently, @include google.* может работать на google.evil.com, а @match google.* не может.
Этот пример недостаточен, чтобы действительно увидеть, как подстановочные знаки ведут себя по-разному между этими двумя, и более подробные объяснения запрашиваются здесь.

Новые сценарии GreaseMonkey (Firefox) используют @include по умолчанию, а новые скрипты TamperMonkey (например, Chrome) используют по умолчанию @match.

В чем же разница между этими двумя?

Например, как каждый из них управляет шаблонами?
Существуют ли различия в кросс-браузерной совместимости?
Какие причины у кого-то есть для выбора одного над другим?

+0

Просто используйте, как и все остальные. Я делал это много лет и не имел никаких проблем. – MortenMoulder

ответ

10

Вы не можете использовать регулярные выражения с помощью @match, а вы - can с @include.

Тем не менее, @include предоставит вашим пользователям более страшные предупреждения о безопасности, применимые ко всем сайтам.

Это даже при том, что @include выражение позволяет вам быть более ограничительным о сайтах скрипт относится (например, указав, что часть URL быть числовой с использованием регулярных выражений фрагмента «[0-9] +», или используя «^ https?: //», чтобы применить к сценарию только эти две схемы, а не более общий оператор non-regex globbing *, используемый для каждого из этих случаев в @match, что заставляет скрипт применяться более широко) ,

+2

Пример, в котором подстановочный символ '@ match' более безопасен, чем подстановочный символ' @ include', можно найти на форуме [Tampermonkey forum] (https://forum.tampermonkey.net/viewtopic.php?t=466): '@include http * : // * .biniok.net' позволяет http: //evil.de#biniok.net, '@match http *: // *. biniok.net' не делает. –

+0

@FranklinYu Не это только потому, что '@ include' интерпретируется как регулярное выражение, и это конкретное регулярное выражение явно разрешает evil.de # biniok.net? '/ *' означает «ноль или больше символов'/'», а «.», который следует, означает «любой символ». Изменение его на '@include^https?: //.*biniok \ .net $' сделало бы его безопасным. – dkasak

+0

@dkasak '@include http *: // *. Biniok.net' интерпретируется как глобусы. Чтобы интерпретироваться как регулярное выражение, оно должно быть '@include/http *: // *. Biniok.net /'. Кроме того, '@include/http *: // * .biniok.net /' не соответствует http://evil.de/#biniok.net; он сопоставляет что-то вроде 'htt:/1biniok2net' или' httppppp: ////// xbiniokynet' –

Смежные вопросы