defmodule Gulib.Const do #### http://elixir-lang.org/docs/master/elixir/Regex.html @ip_regex ~r"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$" @scan_url_regex ~r"((mailto|http|https|thunder|ftp|sftp|svn)\:\/\/|www.)[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\=\&\.\?\,\'\/\\\+&%\$#_]*)?" @email_regex ~r"\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z" @pure_number_regex ~r"\A[0-9]*\z" @words_regex ~r/[\w-_0-9]+/u @match_url_regex ~r"^((mailto|http|https|thunder|ftp|sftp|svn)\:\/\/|www.)[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\=\&\.\?\,\'\/\\\+&%\$#_]*)?$" @mobile_number_formats [ cn: %{ length: 11, regex: ~r/^(0|86|17951)?(13[0-9]|15[0-9]|17[0-9]|18[0-9]|14[0-9])[0-9]{8}$/u } ] @spider_regex ~r(spider|bot|crawler|ysearch\/slurp) def spider_regex, do: @spider_regex @doc "IO地址的正则表达式" def ip_regex, do: @ip_regex @doc "电子邮箱的正则表达式" def email_regex, do: @email_regex @doc "纯数字的正则表达式" def pure_number_regex, do: @pure_number_regex @doc "文字正则" def words_regex, do: @words_regex @doc "只匹配文字,下划线和中划线, 数字" def name_regex_match?(str) do (String.replace(str, @words_regex, "") |> String.length) == 0 end @doc "半角和全角得空格" def space_strings, do: [" ", " "] @doc "匹配URL的正则表达式" def match_url_regex, do: @match_url_regex @doc """ 扫描出URL的正则表达式 ``` eg: * https://msdn.microsoft.com/en-us/library/ff650303.aspx#paght000001_commonregularexpressions * http://stackoverflow.com/questions/1323283/how-to-match-url-in-c ``` """ def scan_url_regex, do: @scan_url_regex @doc "手机号码的正则表达式,按照国家归属" def mobile_number_formats, do: @mobile_number_formats def normalize_mobile_number!(country_key, mobile_number) do if mobile_number_format = @mobile_number_formats |> Gulib.get(country_key) do length_require = mobile_number_format |> Gulib.get(:length) mobile_number = mobile_number |> Gulib.to_s |> String.trim length = String.length(mobile_number) cond do length > length_require -> String.slice(mobile_number, -length_require, length_require) true -> mobile_number end else mobile_number end end def mobile_number_match?(nil, _mobile_number), do: false def mobile_number_match?(_country_key, nil), do: false def mobile_number_match?(country_key, mobile_number) do if mobile_number_format = @mobile_number_formats |> Gulib.get(country_key) do Regex.match?(mobile_number_format[:regex], mobile_number) else false end end end