Получить базовый URL из строки с помощью Regex и Javascript - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь получить базовый URL-адрес из строки (поэтому нет window.location).

  • Нужно удалить косую черту
  • Это должно быть регулярное выражение (без нового URL)
  • Нужно работать с параметрами запроса и ссылками на ссылки

Другими словами, все последующие должны возвращать https://apple.com или https://www.apple.com для последнего.

Это всего лишь примеры, URL могут иметь разные субдомены, например, https://shop.apple.co.uk/?query=foo должен возвращать https://shop.apple.co.uk - Это может быть любой URL, например: https://foo.bar

Чем ближе я оказался:

const baseUrl = url.replace(/^((\w+:)?\/\/[^\/]+\/?).*$/,'$1').replace(/\/$/, ""); // Base Path & Trailing slash

Но это не работает с якорными ссылками и запросами, которые начинаются сразу после URL без / до

Есть идеи, как заставить его работать во всех случаях?

Ответы [ 5 ]

0 голосов
/ 09 января 2019

Вы можете добавить # и ? к вашему отрицательному классу символов . Вам не нужно .*, потому что это будет соответствовать до конца строки.

В качестве примера вы можете сопоставить :

^https?:\/\/[^#?\/]+

Regex demo

strings = [
"https://apple.com?query=true&slash=false",
    "https://apple.com#anchor=true&slash=false",
    "http://www.apple.com/#anchor=true&slash=true&whatever=foo",
    "https://foo.bar/?q=true"
];

strings.forEach(s => {
    console.log(s.match(/^https?:\/\/[^#?\/]+/)[0]);
})
0 голосов
/ 09 января 2019
    const baseUrl = url.replace(/(.*:\/\/.*)[\?\/#].*/, '$1');
0 голосов
/ 09 января 2019

Вы можете сделать как ниже

if(url.indexOf('#') !== -1) { var baseUrl = url.split("#")[0]; } else if (url.indexOf('?') !== -1) { var baseUrl = url.split("?")[0]; } else { var baseUrl =  url }
0 голосов
/ 09 января 2019

Вы можете использовать для этого встроенный в JavaScript URL . URL также предоставит вам другие проанализированные свойства, к которым легко получить доступ, например, параметры строки запроса, протокол и т. Д.

Regex - это болезненный способ сделать что-то, что в противном случае JavaScript делает очень простым.

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

let one = "https://apple.com?query=true&slash=false"
let two = "https://apple.com#anchor=true&slash=false"
let three = "http://www.apple.com/#anchor=true&slash=true&whatever=foo"

let urlOne = new URL(one)
console.log(urlOne.origin)

let urlTwo = new URL(two)
console.log(urlTwo.origin)

let urlThree = new URL(three)
console.log(urlThree.origin)
0 голосов
/ 09 января 2019

Это даст вам все до части .com. Вам нужно будет добавить .com, как только вы извлечете первую часть URL.

^http.*?(?=\.com)

Или, может быть, вы могли бы сделать:

myUrl.Replace(/(#|\?|\/#).*$/, "")

Чтобы удалить все после имени хоста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...