Home Articles FAQs XREF Games Software Instant Books BBS About FOLDOC RFCs Feedback Sitemap
irt.Org
#

Q852 How can I validate an IP address that a user tupes into a field to ensure that it has four valid octets?

You are here: irt.org | FAQ | JavaScript | Number | Q852 [ previous next ]

This is hard to do in anything other than JavaScript 1.2. The following code provides support for JavaScript 1.2+ by using regular expressions, and support for lesser versions of JavaScript with repetitive string validation:

<script language="JavaScript"><!--
var validChars = '.0123456789';

function validateIP(what) {
    if (!what)
        return false;

    dots = 0;

    for (var i = 0; i < what.length; i++) {
       var chr = what.substring(i,i+1);
       if (validChars.indexOf(chr) == -1)
           return false;
       if (chr == '.') {
           dots++;
           eval('dot' + dots + ' = ' + i);
       }
    }

    if (dots != 3)
        return false;

    if (what.substring(0,1) == '.' || what.substring(what.length,what.length+1) == '.')
        return false;

    ip1 = what.substring(0,dot1);
    if (!ip1 || ip1 >255)
        return false;
    ip2 = what.substring(dot1+1,dot2);
    if (!ip2 || ip2 >255)
        return false;
    ip3 = what.substring(dot2+1,dot3);
    if (!ip3 || ip3 >255)
        return false;
    ip4 = what.substring(dot3+1,what.length+1);
    if (!ip4 || ip4 >255)
        return false;

    if (ip1 == 0 && ip2 == 0 && ip3 == 0 && ip4 == 0)
        return false;

    return true;
}
//--></script>

<script language="JavaScript1.2"><!--
function validateIP(what) {
    if (what.search(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) != -1) {
        var myArray = what.split(/\./);
        if (myArray[0] > 255 || myArray[1] > 255 || myArray[2] > 255 || myArray[3] > 255)
            return false;
        if (myArray[0] == 0 && myArray[1] == 0 && myArray[2] == 0 && myArray[3] == 0)
            return false;
        return true;
    }
    else
        return false;
}
//--></script>


<form>
<input name="input" type="text" value="18.128.93.86">
<input type="button" value="Validate" onClick="if (!validateIP(this.form.input.value)) alert('invalid'); else alert('valid')">
</form>

The following test harness can be used to test that the above code works correctly:

<script language="JavaScript"><!--
function validateAll(what) {
    for (var i=0; i<23; i++) {
        if (validateIP(what['input' + i].value))
             what['output' + i].value = 'valid';
        else
             what['output' + i].value = 'invalid';

    }
}
//--></script>

<form>
<input name="input0"  type="text" value="18.128.93.86">     <input name="output0" type="text" value=""><br>
<input name="input1"  type="text" value="127.0.0.0">        <input name="output1" type="text" value=""><br>
<input name="input2"  type="text" value="255.255.255.255">  <input name="output2" type="text" value=""><br>
<input name="input3"  type="text" value="0.0.0.0">          <input name="output3" type="text" value=""><br>
<input name="input4"  type="text" value="255.256.255.255">  <input name="output4" type="text" value=""><br>
<input name="input5"  type="text" value="255.255.256.255">  <input name="output5" type="text" value=""><br>
<input name="input6"  type="text" value="255.255.255.256">  <input name="output6" type="text" value=""><br>
<input name="input7"  type="text" value="1234.255.255.255"> <input name="output7" type="text" value=""><br>
<input name="input8"  type="text" value="255.1234.255.255"> <input name="output8" type="text" value=""><br>
<input name="input9"  type="text" value="255.255.1234.255"> <input name="output9" type="text" value=""><br>
<input name="input10" type="text" value="255.255.255.1234"> <input name="output10" type="text" value=""><br>
<input name="input11" type="text" value=".255.255.255">     <input name="output11" type="text" value=""><br>
<input name="input12" type="text" value="255..255.255">     <input name="output12" type="text" value=""><br>
<input name="input13" type="text" value="255.255..255">     <input name="output13" type="text" value=""><br>
<input name="input14" type="text" value="255.255.255.">     <input name="output14" type="text" value=""><br>
<input name="input15" type="text" value="255255255255">     <input name="output15" type="text" value=""><br>
<input name="input16" type="text" value="255,255,255,255">  <input name="output16" type="text" value=""><br>
<input name="input17" type="text" value="">                 <input name="output17" type="text" value=""><br>
<input name="input18" type="text" value="....">             <input name="output18" type="text" value=""><br>
<input name="input19" type="text" value="a.b.c.d">          <input name="output19" type="text" value=""><br>
<input name="input20" type="text" value="255.255.255.255."> <input name="output20" type="text" value=""><br>
<input name="input21" type="text" value=".255.255.255.255"> <input name="output21" type="text" value=""><br>
<input name="input22" type="text" value="256.255.255.255">  <input name="output22" type="text" value=""><br>

<input type="button" value="Validate" onClick="validateAll(this.form)">
<input type="reset">
</form>

©2018 Martin Webb