2017-02-19 2 views
0

Как определить, является ли строка локальным путем или ссылкой на другой сервер?Определить, является ли строка ссылкой на локальный или внешний файл

Например, со следующим списком URL-адресов, как определить, какие из них относятся к локальному пути к файлу или example.com?

var paths = [ 
    'foo/bar.css', 
    '/bar/foo.css', 
    '//cdn.example.com/monkey.css', 
    'https://example.com/banana.css' 
]; 

Я заглянул в пакет url НПМ, однако он не может разобрать третий путь в объект, содержащий множество.

То, что я пытаюсь сделать, это извлечь всю информацию CSS со страницы, а также из связанных таблиц стилей, используя утилиту, которая знает только URL-адрес страницы. Мне нужно знать, куда отправлять последующие запросы либо исходному хосту, либо другому, например example.com.

+0

Третий недействителен! –

+0

Просто проверьте, есть ли ':' в пути! –

+0

Это ссылка на файл для файла CSS в теге href. Он отлично натягивает таблицу стилей, и поскольку в ней нет контроля над тегами href, мне нужен URL независимо. – forrestmid

ответ

1

Для разрешения референс-URI, вы должны предоставить базовый URL. Только тогда вы сможете полностью интерпретировать такой URL.

В вашем примере это будет:

var url = require("url"); 
var baseUrl = 'http://www.google.com/thing'; // insert your actual base URL here 
var paths = [ 
    'foo/bar.css', 
    '/bar/foo.css', 
    '//cdn.example.com/monkey.css', 
    'https://example.com/banana.css' 
]; 
paths.forEach((p)=>{ 
    console.log(url.parse(url.resolve(baseUrl,p)).hostname); 
}); 
+0

Ahh. Ты мой герой. Именно то, что я искал. Я не понимал, что «url.resolve» может это сделать. В документах, предоставленных для него, не отображаются другие URL-адреса. – forrestmid

0

Я бы, вероятно, переместил массив и имел набор операторов if. Что-то вроде этого (не копировать вставить дружественный, псевдо-код)

function checkPath(string) { 
    if(string.contains("https://") 
    if(string.charArray[0] == "/" && string.charArray[1] == "/") 
    if(string.charArray[0] == "/" && !string.charArray[1] == "/") 
    if(string.charArray[0] != "/") 
} 

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

1

Один простой способ - проверить строку на http:// или http://. Вы можете любые дополнительные строки поиска, как вы считаете нужным (ftp:// и т.д.)

var paths = ['foo/bar.css', 
 
      '/bar/foo.css', 
 
      '//cdn.example.com/monkey.css', 
 
      'https://example.com/banana.css']; 
 
       
 
paths.forEach(function(url){ 
 
    var yesNo = (url.indexOf("http:")=== 0 || 
 
       url.indexOf("https:") === 0 || 
 
       url.indexOf("//") === 0 && 
 
       (window.location.protocol === "http:" || window.location.protocol === "https:")) 
 
       ? "" : " NOT"; 
 
    console.log(url + " is" + yesNo + " an external path"); 
 
});

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