Соответствие URL с подстановочными знаками - PullRequest
1 голос
/ 25 июня 2010

Я пытаюсь сопоставить URL-адреса с подстановочными знаками в них фактическим URL-адресам.Например:

http://*google.com/*

Требуется совпадение

http://maps.google.com

И

http://www.google.com/maps

Как лучше всего это сделать?

Я пытался использовать регулярное выражение, и это прекрасно работает, когда я вручную его программирую, но я не уверен, возможно ли динамически генерировать регулярные выражения или это будет лучшим решением в этой ситуации.

/(http|https):\/\/.*\.?google\.com\/?.*/i

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

Генерация регулярного выражения, вероятно, является правильным способом, но это сложнее, чем простая замена звездочек.

Например, ваш шаблон http://*google.com/* не должен совпадать с http://www.malicioushacker.org/1337/google.com/maps.

2 голосов
/ 25 июня 2010

Если вы хотите увидеть хорошо протестированную библиотеку для извлечения частей URI, я бы ознакомился с методами goog.uri.utils библиотеки Google Closure.

https://github.com/google/closure-library/blob/8e44fb343fff467938f9476ba7f727c6acac76d8/closure/goog/uri/utils.js#L187

Вот регулярное выражение, которое делает тяжелую работу:

goog.uri.utils.splitRe_ = new RegExp(
    '^' +
    '(?:' +
      '([^:/?#.]+)' +                     // scheme - ignore special characters
                                          // used by other URL parts such as :,
                                          // ?, /, #, and .
    ':)?' +
    '(?://' +
      '(?:([^/?#]*)@)?' +                 // userInfo
      '([\\w\\d\\-\\u0100-\\uffff.%]*)' + // domain - restrict to letters,
                                          // digits, dashes, dots, percent
                                          // escapes, and unicode characters.
      '(?::([0-9]+))?' +                  // port
    ')?' +
    '([^?#]+)?' +                         // path
    '(?:\\?([^#]*))?' +                   // query
    '(?:#(.*))?' +                        // fragment
    '$');
1 голос
/ 25 июня 2010

Заменить все вхождения * в шаблоне на [^ ]* - это соответствует последовательности из нуля или более непробельных символов.

Таким образом http://*google.com/* станет http://[^ ]*google.com/[^ ]*

Вот регулярное выражение для выполнения задачи:

regex = urlPattern.replace(/\*/g, "[^ ]*");
...