Modulo per verificare se una data stringa rappresenta un indirizzo IP valido. Il template corrispondente è Template:IP?.

Le funzioni disponibili sono is_ipv4, is_ipv6 e is_ip da usare per convalidare, rispettivamente, secondo lo standard IPv4, IPv6 o uno dei due indistintamente. Non è prevista la convalida di IPv4-mapped address né di IPv4-compatible address.

Di seguito alcuni esempi d'uso:

Funzione Stringa da analizzare Codice da usare Risultato
is_ipv4 0.0.0.0 {{#invoke:IP validator|is_ipv4|0.0.0.0}} 1
93.2.50.255 {{#invoke:IP validator|is_ipv4|93.2.50.255}} 1
93.2.50.256 {{#invoke:IP validator|is_ipv4|93.2.50.256}}
93.2.50 {{#invoke:IP validator|is_ipv4|93.2.50}}
A.2.50.255 {{#invoke:IP validator|is_ipv4|A.2.50.255}}
is_ipv6 2001:13:A1B:90F:512:FFFF:88:AF3 {{#invoke:IP validator|is_ipv6|2001:13:A1B:90F:512:FFFF:88:AF3}} 1
4:4:4:4:4:4:4:4 {{#invoke:IP validator|is_ipv6|4:4:4:4:4:4:4:4}} 1
2001:13:A1B::FFFF:AF3 {{#invoke:IP validator|is_ipv6|2001:13:A1B::FFFF:AF3}} 1
2001:13:A1B:90F::FFFF:88:AF3 {{#invoke:IP validator|is_ipv6|2001:13:A1B:90F::FFFF:88:AF3}}
2001::90F::FFFF:88:AF3 {{#invoke:IP validator|is_ipv6|2001::90F::FFFF:88:AF3}}
2001:13:A1B:90F:512:FFFF:88 {{#invoke:IP validator|is_ipv6|2001:13:A1B:90F:512:FFFF:88}}
2001.13.A1B.90F.512.FFFF.88.AF3 {{#invoke:IP validator|is_ipv6|2001.13.A1B.90F.512.FFFF.88.AF3}}
is_ip 1.2.3.4 {{#invoke:IP validator|is_ip|1.2.3.4}} 1
2001:13:A1B:90F:512:FFFF:88:AF3 {{#invoke:IP validator|is_ip|2001:13:A1B:90F:512:FFFF:88:AF3}} 1
4:4:4:4 {{#invoke:IP validator|is_ip|4:4:4:4}}
test {{#invoke:IP validator|is_ip|test}}

--[[
* Questo modulo serve per validare un indirizzo IP.
* È necessario un algoritmo iterativo in quanto le espressioni regolari di Lua non sono sufficientemente espressive.
]]
local p = {}

-- =============================================================================
--                            Funzioni per moduli
-- =============================================================================

-- Questa funzione ritorna '1' se la stringa in input corrisponde allo standard IPv4, altrimenti un valore nullo.
function p._is_ipv4(s)
    s = s:gsub("/[0-9]$", ""):gsub("/[12][0-9]$", ""):gsub("/[3][0-2]$", "")
    
    if not s:find("^%d+%.%d+%.%d+%.%d+$") then
        return nil
    end
    
    for substr in s:gmatch("(%d+)") do
        if not substr:find("^[1-9]?[0-9]$")
                and not substr:find("^1[0-9][0-9]$")
                and not substr:find( "^2[0-4][0-9]$")
                and not substr:find("^25[0-5]$") then
            return nil
        end
    end
    
    return '1'
end

-- Questa funzione ritorna '1' se la stringa in input corrisponde allo standard IPv6, altrimenti un valore nullo.
function p._is_ipv6(s)
    if not (s:find("^%w+:%w+:%w+:%w+:%w+:%w+:%w+:%w+$")          -- caso in cui ci sono esattamente sette ":"
                or (s:find("^%w*:%w*:%w*:?%w*:?%w*:?%w*:?%w*$")  -- altrimenti devono esserci fra i due e i sei ":"
            	    and s:find("::")))                           -- e dev'esserci la sottostringa "::"
            or s:find("::.*::")                                  -- ma non possono mai esserci due sottostringhe "::"
            or s:find(":::") then                                -- né una sottostringa ":::"
        return nil
    end
    
    for substr in s:gmatch("(%w+)") do
        if not substr:find("^[0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?$") then
            return nil
        end
    end
    
    return '1'
end

-- Questa funzione ritorna '1' se la stringa in input corrisponde allo standard IPv4 o IPv6, altrimenti un valore nullo.
function p._is_ip(s)
    return p._is_ipv4(s) or p._is_ipv6(s)
end

-- =============================================================================
--                            Funzioni per template
-- =============================================================================

function p.is_ipv4(frame) return p._is_ipv4(frame.args[1] or '') end	--Uso: {{#invoke:IP validator|is_ipv4|stringa}}
function p.is_ipv6(frame) return p._is_ipv6(frame.args[1] or '') end	--Uso: {{#invoke:IP validator|is_ipv6|stringa}}
function p.is_ip  (frame) return p._is_ip  (frame.args[1] or '') end	--Uso: {{#invoke:IP validator|is_ip|stringa}}

return p