IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 07 Kasım 2014, 06:24   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
RFC-compliant email address validator




PHP Kod:   Kodu kopyalamak için üzerine çift tıklayın!
This source file is subject to the Common Public Attribution License Version 1.0 (CPALlicense.
The license terms are available through the world-wide-web at http://
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
style="color: #007700">*/

//    PHPLint modules
/*.
require_module 'standard';
require_module 'pcre';
.*/
/*.boolean.*/ 
function is_email (/*.string.*/ $email$checkDNS false) {
//    Check that $email is a valid address. Read the following RFCs to understand the constraints:
//    (http://tools.ietf.org/html/rfc5322)
//    (http://tools.ietf.org/html/rfc3696)
//    (http://tools.ietf.org/html/rfc5321)
//    (http://tools.ietf.org/html/rfc4291#section-2.2)
//    (http://tools.ietf.org/html/rfc1123#section-2.1)

//    the upper limit on address lengths should normally be considered to be 256
//    (
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
style="color: #0000BB">$emailLength 
strlen($email);
if (
$emailLength 256)    return false;    //    Too long

//    Contemporary email addresses consist of a "local part" separated from
//    a "domain part" (a fully-qualified domain name) by an at-sign ("@").
//    (http://tools.ietf.org/html/rfc3696#section-3)
$atIndex    strrpos($email,'@');

if (
$atIndex === false)    return false;    //    No at-sign
if ($atIndex === 0)    return false;    //    No local part
if ($atIndex === $emailLength)    return false;    //    No domain part

//    Sanitize comments
//    - remove nested comments, quotes and dots in comments
//    - remove parentheses and dots from quoted strings
$braceDepth    0;
$inQuote    false;
$escapeThisChar    false;

for (
$i 0$i $emailLength; ++$i) {
$char $email[$i];
$replaceChar false;

if (
$char === '\\') {
$escapeThisChar = !$escapeThisChar;    //    Escape the next character?
} else {
switch (
$char) {
case 
'(':
if (
$escapeThisChar) {
$replaceChar true;
} else {
if (
$inQuote) {
$replaceChar true;
} else {
if (
$braceDepth++ > 0$replaceChar true;    //    Increment brace depth
}
}

break;
case 
')':
if (
$escapeThisChar) {
$replaceChar true;
} else {
if (
$inQuote) {
$replaceChar true;
} else {
if (--
$braceDepth 0$replaceChar true;    //    Decrement brace depth
if ($braceDepth 0$braceDepth 0;
}
}

break;
case 
'"':
if (
$escapeThisChar) {
$replaceChar true;
} else {
if (
$braceDepth === 0) {
$inQuote = !$inQuote;    //    Are we inside a quoted string?
} else {
$replaceChar true;
}
}

break;
case 
'.':    //    Dots don't help us either
if ($escapeThisChar) {
$replaceChar true;
} else {
if (
$braceDepth 0$replaceChar true;
}

break;
}

$escapeThisChar false;
if (
$replaceChar$email[$i] = 'x';    //    Replace the offending character with something harmless
}
}

$localPart    substr($email0$atIndex);
$domain    substr($email$atIndex 1);
$FWS    "(?:(?:(?:[ \\t]*(?:\\r\\n))?[ \\t]+)|(?:[ \\t]+(?:(?:\\r\\n)[ \\t]+)*))";    //    Folding white space
//    Let's check the local part for RFC compliance...
//
//    local-part = dot-atom / quoted-string / obs-local-part
//    obs-local-part = word *("." word)
//    (http://tools.ietf.org/html/rfc5322#section-3.4.1)
//
//    Problem: need to distinguish between "first.last" and "first"."last"
//    (i.e. one element or two). And I suck at regexes.
$dotArray    /*. (array[int]string) .*/ preg_split('/\\.(?=(?:[^\\"]*\\"[^\\"]*\\")*(?![^\\"]*\\"))/m'$localPart);
$partLength 0;

foreach (
$dotArray as $element) {
//    Remove any leading or trailing FWS
$element preg_replace("/^$FWS|$FWS\$/"''$element);

//    Then we need to remove all valid comments (i.e. those at the start or end of the element
$elementLength strlen($element);

if (
$element[0] === '(') {
$indexBrace strpos($element')');
if (
$indexBrace !== false) {
if (
preg_match('/(?<!\\\\)[\\(\\)]/'substr($element1$indexBrace 1)) > 0) {
return 
false;    //    Illegal characters in comment
}
$element substr($element$indexBrace 1$elementLength $indexBrace 1);
$elementLength strlen($element);
}
}

if (
$element[$elementLength 1] === ')') {
$indexBrace strrpos($element'(');
if (
$indexBrace !== false) {
if (
preg_match('/(?<!\\\\)(?:[\\(\\)])/'substr($element$indexBrace 1$elementLength $indexBrace 2)) > 0) {
return 
false;    //    Illegal characters in comment
}
$element substr($element0$indexBrace);
$elementLength strlen($element);
}
}    

//    Remove any leading or trailing FWS around the element (inside any comments)
$element preg_replace("/^$FWS|$FWS\$/"''$element);

//    What's left counts towards the maximum length for this part
if ($partLength 0$partLength++;    //    for the dot
$partLength += strlen($element);

//    Each dot-delimited component can be an atom or a quoted string
//    (because of the obs-local-part provision)
if (preg_match('/^"(?:.)*"$/s'$element) > 0) {
//    Quoted-string tests:
//
//    Remove any FWS
$element preg_replace("/(?<!\\\\)$FWS/"''$element);
//    My regex skillz aren't up to distinguishing between \" \\" \\\" \\\\" etc.
//    So remove all \\ from the string first...
$element preg_replace('/\\\\\\\\/'' '$element);
if (
preg_match('/(?<!\\\\|^)["\\r\\n\\x00](?!$)|\\\\"$|""/'$element) > 0)    return false;    //    ", CR, LF and NUL must be escaped, "" is too short
} else {
//    Unquoted string tests:
//
//    Period (".") may...appear, but may not be used to start or end the
//    local part, nor may two or more consecutive periods appear.
//    (http://tools.ietf.org/html/rfc3696#section-3)
//
//    A zero-length element implies a period at the beginning or end of the
//    local part, or two periods together. Either way it's not allowed.
if ($element === '')    return false;    //    Dots in wrong place

//    Any ASCII graphic (printing) character other than the
//    at-sign ("@"), backslash, double quote, comma, or square brackets may
//    appear without quoting. If any of that list of excluded characters
//    are to appear, they must be quoted
//    (http://tools.ietf.org/html/rfc3696#section-3)
//
//    Any excluded characters? i.e. 0x00-0x20, (, ), <, >, [, ], :, ;, @, \, comma, period, "
if (preg_match('/[\\x00-\\x20\\(\\)<>\\[\\]:;@\\\\,\\."]/'$element) > 0)    return false//    These characters must be in a quoted string
}
}

if (
$partLength 64) return false;    // Local part must be 64 characters or less

//    Now let's check the domain part...

//    The domain name can also be replaced by an IP address in square brackets
//    (http://tools.ietf.org/html/rfc3696#section-3)
//    (http://tools.ietf.org/html/rfc5321#section-4.1.3)
//    (http://tools.ietf.org/html/rfc4291#section-2.2)
if (preg_match('/^\\[(.)+]$/'$domain) === 1) {
//    It's an address-literal
$addressLiteral substr($domain1strlen($domain) - 2);
$matchesIP    = array();

//    Extract IPv4 part from the end of the address-literal (if there is one)
if (preg_match('/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'$addressLiteral$matchesIP) > 0) {
$index strrpos($addressLiteral$matchesIP[0]);

if (
$index === 0) {
//    Nothing there except a valid IPv4 address, so...
return true;
} else {
//    Assume it's an attempt at a mixed address (IPv6 + IPv4)
if ($addressLiteral[$index 1] !== ':')    return false;    //    Character preceding IPv4 address must be ':'
if (substr($addressLiteral05) !== 'IPv6:')    return false;    //    RFC5321 section 4.1.3

$IPv6 substr($addressLiteral5, ($index ===7) ? $index 6);
$groupMax 6;
}
} else {
//    It must be an attempt at pure IPv6
if (substr($addressLiteral05) !== 'IPv6:')    return false;    //    RFC5321 section 4.1.3
$IPv6 substr($addressLiteral5);
$groupMax 8;
}

$groupCount    preg_match_all('/^[0-9a-fA-F]{0,4}|\\:[0-9a-fA-F]{0,4}|(.)/'$IPv6$matchesIP);
$index    strpos($IPv6,'::');

if (
$index === false) {
//    We need exactly the right number of groups
if ($groupCount !== $groupMax)    return false;    //    RFC5321 section 4.1.3
} else {
if (
$index !== strrpos($IPv6,'::'))    return false;    //    More than one '::'
$groupMax = ($index === || $index === (strlen($IPv6) - 2)) ? $groupMax $groupMax 1;
if (
$groupCount $groupMax)    return false;    //    Too many IPv6 groups in address
}

//    Check for unmatched characters
array_multisort($matchesIP[1], SORT_DESC);
if (
$matchesIP[1][0] !== '')    return false;    //    Illegal characters in address

//    It's a valid IPv6 address, so...
return true;
} else {
//    It's a domain name...

//    The syntax of a legal Internet host name was specified in RFC-952
//    One aspect of host name syntax is hereby changed: the
//    restriction on the first character is relaxed to allow either a
//    letter or a digit.
//    (http://tools.ietf.org/html/rfc1123#section-2.1)
//
//    NB RFC 1123 updates RFC 1035, but this is not currently apparent from reading RFC 1035.
//
//    Most common applications, including email and the Web, will generally not
//    permit...escaped strings
//    (http://tools.ietf.org/html/rfc3696#section-2)
//
//    the better strategy has now become to make the "at least one period" test,
//    to verify LDH conformance (including verification that the apparent TLD name
//    is not all-numeric)
//    (http://tools.ietf.org/html/rfc3696#section-2)
//
//    Characters outside the set of alphabetic characters, digits, and hyphen MUST NOT appear in domain name
//    labels for SMTP clients or servers
//    (http://tools.ietf.org/html/rfc5321#section-4.1.2)
//
//    RFC5321 precludes the use of a trailing dot in a domain name for SMTP purposes
//    (http://tools.ietf.org/html/rfc5321#section-4.1.2)
$dotArray    /*. (array[int]string) .*/ preg_split('/\\.(?=(?:[^\\"]*\\"[^\\"]*\\")*(?![^\\"]*\\"))/m'$domain);
$partLength 0;

if (
count($dotArray) === 1)    return false;    //    Mail host can't be a TLD

foreach ($dotArray as $element) {
//    Remove any leading or trailing FWS
$element preg_replace("/^$FWS|$FWS\$/"''$element);

//    Then we need to remove all valid comments (i.e. those at the start or end of the element
$elementLength strlen($element);

if (
$element[0] === '(') {
$indexBrace strpos($element')');
if (
$indexBrace !== false) {
if (
preg_match('/(?<!\\\\)[\\(\\)]/'substr($element1$indexBrace 1)) > 0) {
return 
false;    //    Illegal characters in comment
}
$element substr($element$indexBrace 1$elementLength $indexBrace 1);
$elementLength strlen($element);
}
}

if (
$element[$elementLength 1] === ')') {
$indexBrace strrpos($element'(');
if (
$indexBrace !== false) {
if (
preg_match('/(?<!\\\\)(?:[\\(\\)])/'substr($element$indexBrace 1$elementLength $indexBrace 2)) > 0) {
return 
false;    //    Illegal characters in comment
}
$element substr($element0$indexBrace);
$elementLength strlen($element);
}
}    

//    Remove any leading or trailing FWS around the element (inside any comments)
$element preg_replace("/^$FWS|$FWS\$/"''$element);

//    What's left counts towards the maximum length for this part
if ($partLength 0$partLength++;    //    for the dot
$partLength += strlen($element);

//    The DNS defines domain name syntax very generally -- a
//    string of labels each containing up to 63 8-bit octets,
//    separated by dots, and with a maximum total of 255
//    octets.
//    (http://tools.ietf.org/html/rfc1123#section-6.1.3.5)
if ($elementLength 63)    return false;    //    Label must be 63 characters or less

//    Each dot-delimited component must be atext
//    A zero-length element implies a period at the beginning or end of the
//    local part, or two periods together. Either way it's not allowed.
if ($elementLength === 0)    return false;    //    Dots in wrong place

//    Any ASCII graphic (printing) character other than the
//    at-sign ("@"), backslash, double quote, comma, or square brackets may
//    appear without quoting. If any of that list of excluded characters
//    are to appear, they must be quoted
//    (http://tools.ietf.org/html/rfc3696#section-3)
//
//    If the hyphen is used, it is not permitted to appear at
//    either the beginning or end of a label.
//    (http://tools.ietf.org/html/rfc3696#section-2)
//
//    Any excluded characters? i.e. 0x00-0x20, (, ), <, >, [, ], :, ;, @, \, comma, period, "
if (preg_match('/[\\x00-\\x20\\(\\)<>\\[\\]:;@\\\\,\\."]|^-|-$/'$element) > 0) {
return 
false;
}
}

if (
$partLength 255) return false;    // Local part must be 64 characters or less

if (preg_match('/^[0-9]+$/'$element) > 0)    return false;    //    TLD can't be all-numeric

//    Check DNS?
if ($checkDNS && function_exists('checkdnsrr')) {
if (!(
checkdnsrr($domain'A') || checkdnsrr($domain'MX'))) {
return 
false;    //    Domain doesn't actually exist
}
}
}

//    Eliminate all other factors, and the one which remains must be the truth.
//    (Sherlock Holmes, The Sign of Four)
return true;
}
?> 


__________________
Bu kez pek bir afili yalnızlık, ağlatan bir kadın kadar düşman. Ağzı bozuk üstelik bırakmıyor acıtmadan.
 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları reklam ver Benimmekan Mobil Sohbet
Cevapla

Etiketler
address, email, rfccompliant, validator


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık