javascript-正则表达式仅验证特定网址

时间:2018-01-18 10:23:13

标签: javascript jquery regex

我创建了一个reg exp,用于仅验证列表中参数p的值介于100和9999之间的URL。 因此,从下面给出的列表中,只有第3和第4个URL在输入文本框时需要返回true作为输出。

http://www.website.com/our-resources/news/?p=1
http://www.website.com/example/voice-of-the-customer/news/?p=12
http://www.website.com/our-resources/news/?p=123
http://www.website.com/example/?p=4321
http://www.website.com/example/products/touchchat/news/?p=12345

HTML

<input type=url/>
<button>Validate</button>
<div id=status></div>

的Javascript

$('button').click(function(){
    var val = $('input').val();
    var regex = /^(https?:\/\/)?[a-z0-9-]*\.?[a-z0-9-]+\.[a-z0-9-]+(\/[^<>]*)?$/;
    var isValid = regex.test(val);
    $('#status').text(isValid);
});

但是这个正则表达式对所有URL都返回true。 我应该对这个表达做出什么改变?

FIDDLE

4 个答案:

答案 0 :(得分:2)

更简单的解决方案是retrieve the querystring parameter from the URL,然后检查其值是否符合您的界限:

&#13;
&#13;
$('button').click(function() {
  var p = parseInt(getParameterByName('p', $('input').val()), 10) || 0;
  var isValid = p >= 100 && p <= 9999;
  $('#status').text(isValid);
});

function getParameterByName(name, url) {
  if (!url)
    url = window.location.href;
  name = name.replace(/[\[\]]/g, "\\$&");
  var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
  if (!results)
    return null;
  if (!results[2])
    return '';
  return decodeURIComponent(results[2].replace(/\+/g, " "));
}
&#13;
body {
  font: 10pt Verdana;
}

input {
  width: 100%;
  display: block;
  margin-bottom: 1em;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="url" value="http://google.com/" />
<button>Validate</button>
<div id="status"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用URL

var fnGetURL = ( strURL ) => {
   try
   {
      return new URL( strURL );
   }
   catch(e)
   {
      return null;
   }
};

如果未返回null,则获取searchParams

var fnIsValidURL = ( strURL ) => {
   var url = fnGetURL( strURL );
   if ( url )
   {
      var p = +url.searchParams.get("p");
      return p >= 100 && p <= 9999;
   }
   return false;
};

<强>演示

&#13;
&#13;
var fnGetURL = (strURL) => {
  try {
    return new URL(strURL);
  } catch (e) {
    return null;
  }
};


var fnIsValidURL = (strURL) => {
  var url = fnGetURL(strURL);
  if (url) {
    var p = +url.searchParams.get("p");
    return p >= 100 && p <= 9999;
  }
  return false;
};

var urlArr = ["http://www.website.com/our-resources/news/?p=1",
"http://www.website.com/example/voice-of-the-customer/news/?p=12",
"http://www.website.com/our-resources/news/?p=123",
"http://www.website.com/example/?p=4321",
"http://www.website.com/example/products/touchchat/news/?p=12345"];

urlArr.forEach( function(url){
   console.log( url, fnIsValidURL(url) ); 
});
&#13;
&#13;
&#13;

答案 2 :(得分:0)

试试这个:

function isValidParam(url) {
    if ($.urlParam('p',url) > 99 && $.urlParam('p',url)<10000) {
        return true;
    }
    return false;
}

调用上述方法检查网址有效性

$.urlParam = function(name,url) {
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)')
            .exec(url);
    if (results == null) {
        return null;
    } else {
        return results[1] || 0;
    }
};

答案 3 :(得分:0)

这可能过于简单,但我发现这个正则表达式适用于您正在寻找的内容。

/(?:http://[\S]*)\/\?p=(\d{3,4})$/g