Intentando crear una expresión regular en la que la cadena no debería comenzar con http (s): //, http (s): // www. El resto de la cadena puede ser cualquier cosa.

Usé este regeg pero su retorno es verdadero si tenemos http://

^(http://www.|https://www.|http://|https://)?[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$

Otro que probé es

var re = new RegExp("(http|https|ftp)://");
var str = "http://xxxx.com";
var match = re.test(str);
console.log(match);

Este también está volviendo cierto.

Demostración aquí

let re = /(http|https|ftp):///;
let url = 'xxxx.xxxx.xxxx'; // this is valid but test returns false
let url2 = 'https://www.xxzx.com/xxx.aspx'; // this should fail as there is https://www in url

console.log(re.test(url)); //
console.log(re.test(url2)); //

¿Es esto posible con regex?

1
phantomCoder 10 may. 2019 a las 07:48

4 respuestas

La mejor respuesta

Debe usar una búsqueda anticipada negativa en su expresión regular para descartar cadenas que comiencen con protocolos como http o https o ftp. Puedes usar esta expresión regular,

^(?!(?:ftp|https?):\/\/(www\.)?).+$

Regex Demo

JS Demo,

const arr = ['xxxx.xxxx.xxxx','ftp://www.xxzx.com/xxx.aspx','https://www.xxzx.com/xxx.aspx','http://xxxx.com','https://xxzx.com/xxx.aspx','http://www.xxxx.com']

arr.forEach(s => console.log(s + " --> " + /^(?!(?:ftp|https?):\/\/(www\.)?).+$/.test(s)))
2
Pushpesh Kumar Rajwanshi 10 may. 2019 a las 05:00

Si solo estás tratando de negar esa expresión regular:

function doesMatch(string) {
	return !/^http(s):\/\/(?:www)?/.test(string);
}

[
	'https://www.xxzx.com/xxx.aspx',
	'http://www.xxxx.com',
	'https://xxxx.com',
	'http://xxxx.com',
	'https://aaaa.com',
	'aaaa.com'
].forEach(s => console.log(doesMatch(s)));
0
Rafael 10 may. 2019 a las 04:55

Probablemente sea posible hacerlo con expresiones regulares, pero a menos que tenga que usar una expresión regular, debe usar clase de URL:

let HTTP_URL = 'https://www.xxzx.com/xxx.aspx'
let HTTPS_URL = 'https://www.xxzx.com/xxx.aspx'
let FTP_URL = 'ftp://www.xxzx.com/xxx.aspx'
let GOOD_PROTOCOL = 'mysql://www.xxzx.com/xxx.aspx'
let GOOD_INPUT = '129.123.12.123'

function test_url(url) {
    let bad_protocols = ['http:', 'https:', 'ftp:']
  try {
        var parsed = new URL(url)
  } catch {
    return true
  }
  return (!bad_protocols.contains(parsed.protocol))
}

test_url(HTTP_URL) //false
test_url(HTTPS_URL) //false
test_url(FTP_URL) //false
test_url(GOOD_PROTOCOL) //true
test_url(GOOD_INPUT) //true
2
howderek 10 may. 2019 a las 05:09

In your example code, re.test (url) devuelve falso, porque no hay presencia de http o https en esa cadena. En url2 (es decir, 'https://www.xxzx.com/xxx.aspx'), hay una presencia de https, por lo que está volviendo verdadero.

0
Yamini John 10 may. 2019 a las 05:00