我有以下表达式来验证URL,但它在浏览器上给出了语法错误。我不是正则表达式的专家,所以我不确定我在寻找什么。我也希望它测试http://和https:// urls。
"url":{
"regex":"/^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$/",
"alertText":"URL must start with http://"}
澄清我正在寻找正则表达式和语法问题的帮助。我根据所有答案尝试了大约20种不同的变化,但仍然没有运气。为了清楚起见,我不需要验证整个URL。我只需要验证它是以http://或https://开头的,但如果留空则不能验证失败。我可以使用这个
来获取http部分/^https?:///
无需逃避/偶数。但是当我尝试输入字段为空时它会失败:
/^(https?://)?/
我收到错误消息“未终止的括号/ ^(https?://)/”。
只是为了混淆更多的问题,这是我昨天添加的用于验证日期或没有条目的内容,它与我的格式相同。
/^([0-9]{1,2}\-\[0-9]{1,2}\-\[0-9]{4})?$/
答案 0 :(得分:2)
如果要测试URL或空输入,可能需要进行两次传递。
我会做类似以下的事情(假设urlString是我的输入)。
// get rid of whitespace, in case user hit spacebar/tab
// also removes leading/trailing spaces.
urlString = urlString.replace(/[\s]*/g,'');
// test if zero length string, if not, test the url.
if( urlString.length > 0 ){ // test the URL
var re = new RegExp( your_expression_goes_here );
var result = re.exec(urlString);
if( result != null ) {
// we have a hit!!! this is a URL.
} else {
// this is a bad string.
}
} else {
// user entered no text, let's move on.
}
因此,前面应该可以工作并允许您测试空字符串或URL。对于正在使用“/(http | https):///”的正则表达式,我认为它有点缺陷。是的,它会捕获“ http:// ”或“ https:// ”,但它也会键入一个字符串,如“ htthttp:/ / “这显然不是你想要的。
您的其他示例“/ ^(http | https):///”更好,因为它将从字符串的开头匹配,并告诉您字符串是否像URL一样开始。
现在,我认为上面的jrob是关于测试完整URL的第二个字符串在正确的轨道上。我想我找到了他在this页面上使用的相同样本。我已经修改了下面的表达式,并使用在线正则表达式测试器对其进行了测试,因为我是新用户,所以无法发布链接:D。
如果输入字符串以任何方式是无效的URL,它似乎捕获了一整行有效的URL并产生错误,至少对于我能想到的无效URL。它也只捕获http / https协议,我认为这是你的基本要求。
^(?:http(?:s?)\:\/\/|~/|/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+([a-zA-Z]{2,9}))(?::[\d]{1,5})?(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$
希望这有帮助。
更新了代码(两次)。
我仍然强烈建议您按照我之前的示例首先测试空字符串,如果字符串不为零,则只测试有效值。我试图将两个测试合并为一个,但到目前为止还没有这样做(也许其他人仍然可以解决这个问题。)
以下测试对我有用,这里是您需要的URL示例:
//var re = /^(?:http(?:s?)\:\/\/)/;
// the following expression will test for http(s):// and empty string
var re = /^(?:http(?:s?)\:\/\/)*$/;
// use the precompiled expression above, or the following
// two lines:
//var reTxt = "^(?:http(?:s?)\:\/\/)";
//var re = new RegExp(reTxt);
alert(
"result:" + re.test("http://") +
"\nresult:" + re.test("https://") +
"\nresult:" + re.test("") +
"\nresult:" + re.test("https:") +
"\nresult:" + re.test("xhttp://") +
"\nresult:" + re.test("ftp://") +
"\nresult:" + re.test("http:/") +
"\nresult:" + re.test("http://somepage.com") +
"\nresult:" + re.test("httphttp://") +
"\nresult:" + re.test(" http://") +
"\nresult:" + re.test("Random text")
);
这是对日期的测试:
var re2 = /^[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{4}$/;
// use the precompiled expression above, or the following
// two lines:
//var reDateTxt = /^[0-9]{1,2}\-[0-9]{1,2}\-[0-9]{4}$/;
//var re2 = new RegExp(reDateTxt);
alert(
"result:" + re2.test("02-02-2009") +
"\nresult:" + re2.test("022-02-2009") +
"\nresult:" + re2.test("02-032-2009") +
"\nresult:" + re2.test("02-02-23009") +
"\nresult:" + re2.test(" 02-02-2009") +
"\nresult:" + re2.test("02-0a2-2009") +
"\nresult:" + re2.test("02-02-2009") +
"\nresult:" + re2.test("Random text")
);
答案 1 :(得分:2)
以下是the spec on URIs,其中的网址是子集,如果您确定所有关注的内容,则此处为the spec on URLs。只使用一个正则表达式,完全实现其中任何一个都是不可能的。
如果您确实要验证URL,您知道的URL将是HTTP或HTTPS,请向其发送HTTP HEAD请求并检查响应代码。
或者,如果您打算使用规范,请确定您愿意接受输入的宽松程度,以及排除有效URL或允许错误URL更好。
答案 2 :(得分:2)
对于它的价值,语法错误是未转义的正斜杠: /
\S*
\/