3

API JavaScript JavaScript использует match patterns в разных местах. В расширении Chrome существует ли способ вручную вызывать любые функции, которые использует Google для проверки того, сохраняется ли URL-адрес по заданному шаблону соответствия? У меня есть куча URL-адресов, которые я бы хотел проверить.Вызовите API «совпадений» Google?

+0

@RobW Упс, не заметил, что вы закрыли вопрос. Теперь у нас есть другая реализация с нуля. – Xan

ответ

3

Нет, нет. Однако реплицировать его с помощью регулярных выражений не так сложно.

Вот реализация. Он проверяет нормальные ограничения на шаблоны соответствия, но не проверяет правильность хоста шаблона/тестового URL-узла.

function patternToRegExp(pattern){ 
    if(pattern == "<all_urls>") return /^(?:http|https|file|ftp):\/\/.*/; 

    var split = /^(\*|http|https|file|ftp):\/\/(.*)$/.exec(pattern); 
    if(!split) throw Error("Invalid schema in " + pattern); 
    var schema = split[1]; 
    var fullpath = split[2]; 

    var split = /^([^\/]*)\/(.*)$/.exec(fullpath); 
    if(!split) throw Error("No path specified in " + pattern); 
    var host = split[1]; 
    var path = split[2]; 

    // File 
    if(schema == "file" && host != "") 
    throw Error("Non-empty host for file schema in " + pattern); 

    if(schema != "file" && host == "") 
    throw Error("No host specified in " + pattern); 

    if(!(/^(\*|\*\.[^*]+|[^*]*)$/.exec(host))) 
    throw Error("Illegal wildcard in host in " + pattern); 

    var reString = "^"; 
    reString += (schema == "*") ? "https*" : schema; 
    reString += ":\\/\\/"; 
    // Not overly concerned with intricacies 
    // of domain name restrictions and IDN 
    // as we're not testing domain validity 
    reString += host.replace(/\*\.?/, "[^\\/]*"); 
    reString += "(:\\d+)?"; 
    reString += "\\/"; 
    reString += path.replace("*", ".*"); 
    reString += "$"; 

    return RegExp(reString); 
} 

// Usage example 
// Precompile the expression for performance reasons 
var re = patternToRegExp("*://*.example.com/*.css"); 
// Test against it 
re.test("http://example.com/"); // false 
re.test("https://example.com/css/example.css"); // true 
re.test("http://www.example.com/test.css"); // true 
+0

Одно дополнение: реализация google соответствует всем портам (не позволяет указать). Поэтому, если вам нужно иметь дело с нестандартными портами, вам нужно добавить 'reString + =" (: \\ d +)? ";' Прямо после 'reString + = host.replace (/\*\.?/," [^ \\ /] * ");' – Luke

+0

@ Luke Вперед и отредактируйте это. – Xan

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