Modul:URLutil: Unterschied zwischen den Versionen
w>קיפודנחש (test if a string is a valid ipV4 or ipV6 address) |
w>Dcoetzee (Modify to return object instead of table (convention, works with unit test framework)) |
||
| Zeile 5: | Zeile 5: | ||
]] | ]] | ||
function | function _isIpV6( s ) | ||
local dcolon, groups | local dcolon, groups | ||
if type( s ) ~= "string" | if type( s ) ~= "string" | ||
| Zeile 24: | Zeile 24: | ||
end | end | ||
function | function _isIpV4( s ) | ||
local function legal( n ) return ( tonumber( n ) or 256 ) < 256 end-- in lua 0 is true! | local function legal( n ) return ( tonumber( n ) or 256 ) < 256 end-- in lua 0 is true! | ||
| Zeile 32: | Zeile 32: | ||
end | end | ||
function | function _isIp( s ) | ||
return isIpV4( s ) and "4" or isIpV6( s ) and "6" | return isIpV4( s ) and "4" or isIpV6( s ) and "6" | ||
end | end | ||
local p = {} | |||
function p.isIpV6(frame) return _isIpV6( frame.args[ 1 ] ) and "1" or "0" end | |||
function p.isIpV4(frame) return _isIpV4( frame.args[ 1 ] ) and "1" or "0" end | |||
function p.isIp(frame) return _isIp( frame.args[ 1 ] ) and "1" or "0" end | |||
return p | |||
Version vom 6. März 2013, 03:48 Uhr
Die Dokumentation für dieses Modul kann unter Modul:URLutil/doc erstellt werden
--[[
functions are not "local", so other modules can require this module and call them directly.
we return a table with 3 small stub functions to call the "real" ones, in a scribunto fashion,
so the functions can be called from templates also.
]]
function _isIpV6( s )
local dcolon, groups
if type( s ) ~= "string"
or s:len() == 0
or s:find( "[^:%x]" ) -- only colon and hex digits are legal chars
or s:find( "^:[^:]" ) -- can begin or end with :: but not with single :
or s:find( "[^:]:$" )
or s:find( ":::" )
then
return false
end
s, dcolon = s:gsub( "::", ":" )
if dcolon > 1 then return false end -- at most one ::
s = s:gsub( "^:?", ":" ) -- prepend : if needed, upper
s, groups = s:gsub( ":%x%x?%x?%x?", "" ) -- remove valid groups, and count them
return ( ( dcolon == 1 and groups < 8 ) or ( dcolon == 0 and groups == 8 ) )
and ( s:len() == 0 or ( dcolon == 1 and s == ":" ) ) -- might be one dangling : if original ended with ::
end
function _isIpV4( s )
local function legal( n ) return ( tonumber( n ) or 256 ) < 256 end-- in lua 0 is true!
if type( s ) ~= "string" then return false end
local p1, p2, p3, p4 = s:match( "^(%d+)%.(%d+)%.(%d+)%.(%d+)$" )
return legal( p1 ) and legal( p2 ) and legal( p3 ) and legal( p4 )
end
function _isIp( s )
return isIpV4( s ) and "4" or isIpV6( s ) and "6"
end
local p = {}
function p.isIpV6(frame) return _isIpV6( frame.args[ 1 ] ) and "1" or "0" end
function p.isIpV4(frame) return _isIpV4( frame.args[ 1 ] ) and "1" or "0" end
function p.isIp(frame) return _isIp( frame.args[ 1 ] ) and "1" or "0" end
return p