Мне нужно создать RegExp для проверки URL - PullRequest
0 голосов
/ 28 января 2020

Регулярное выражение в isURL работает не во всех случаях.

Ложные отрицания (неверно возвращает ложь):

https://link.springer.com/article/10.1057/s41303-017-0039-0
https://www.academia.edu/12962582/Embodiment_Semiosis._Violi_P

Ложные срабатывания (неверно возвращает истину:

3.5/5

Создайте регулярное выражение, которое возвращает true для следующих URL-адресов:

http://nonssl.com
https://ssl.com
localhost:3000/
nohttp.com
withslash.com/
sub.domain.com
withpath.com/a/b

И возвращает false для следующего:

например

3.5/5

Мой текущий RegExp =

/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w-]+)+[\w\-_~:/?#[\]\@!\$&'\(\)\*\+,;=]+$/i

Плюс я нашел это RegExp = ^ ((ftp | http | https): //)? (Www.) ?? (?!. (ftp | http | https | www.)) ?? [a-zA-Z0-9 _-] + (. [a-zA-Z] +) + ((/) [\ w #] +) (/ \ w + \? [ a-zA-Z0-9 _] + = \ w + (& [a-zA-Z0-9 _] + = \ w +) *)? $, но принимайте все, кроме localhost: 3000, http://localhost: 3000 /

1 Ответ

0 голосов
/ 28 января 2020

Вот попытка

Вы можете добавить тест для имени пути, чтобы быть уверенным

`https://link.springer.com/article/10.1057/s41303-017-0039-0
https://www.academia.edu/12962582/Embodiment_Semiosis._Violi_P
http://nonssl.com
https://ssl.com
localhost:3000/
nohttp.com
withslash.com/
sub.domain.com
withpath.com/a/b
3.5/5`.split("\n")
  .forEach(txt => {
      let url = new URL(txt.indexOf("http") === 0 ? txt : "http://" + txt);
      let testHost = txt.indexOf("http") === 0 ? txt.split("//")[1].split("/")[0] : txt.split("/")[0];
      if (url.port) console.log("port found",testHost, url.hostname, url.port, testHost === url.hostname + ":" + url.port)
        else console.log(testHost, url.hostname, testHost === url.hostname)
      })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...