WordPress.org

Make WordPress Core

Ticket #9316: better_email_checks.diff

File better_email_checks.diff, 5.5 KB (added by sambauers, 9 years ago)
  • wp-includes/formatting.php

     
    12931293}
    12941294
    12951295/**
    1296  * Checks to see if the text is a valid email address.
     1296 * Verifies that an email is valid.
    12971297 *
     1298 * Does not grok i18n domains. Not RFC compliant.
     1299 *
    12981300 * @since 0.71
    12991301 *
    1300  * @param string $user_email The email address to be checked.
    1301  * @return bool Returns true if valid, otherwise false.
     1302 * @param string $email Email address to verify.
     1303 * @param boolean $check_dns Whether to check the DNS for the domain using checkdnsrr().
     1304 * @return string|bool Either false or the valid email address.
    13021305 */
    1303 function is_email($user_email) {
    1304         $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
    1305         if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false) {
    1306                 if (preg_match($chars, $user_email)) {
    1307                         return true;
    1308                 } else {
    1309                         return false;
     1306function is_email( $email, $check_dns = false )
     1307{
     1308        // Test for the minimum length the email can be
     1309        if ( strlen( $email ) < 3 ) {
     1310                return apply_filters( 'is_email', false, $email, 'email_too_short' );
     1311        }
     1312
     1313        // Test for an @ character after the first position
     1314        if ( strpos( $email, '@', 1 ) === false ) {
     1315                return apply_filters( 'is_email', false, $email, 'email_no_at' );
     1316        }
     1317
     1318        // Split out the local and domain parts
     1319        list( $local, $domain ) = explode( '@', $email, 2 );
     1320
     1321        // LOCAL PART
     1322        // Test for invalid characters
     1323        if ( !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local ) ) {
     1324                return apply_filters( 'is_email', false, $email, 'local_invalid_chars' );
     1325        }
     1326
     1327        // DOMAIN PART
     1328        // Test for sequences of periods
     1329        if ( preg_match( '/\.{2,}/', $domain ) ) {
     1330                return apply_filters( 'is_email', false, $email, 'domain_period_sequence' );
     1331        }
     1332
     1333        // Test for leading and trailing periods and whitespace
     1334        if ( trim( $domain, " \t\n\r\0\x0B." ) !== $domain ) {
     1335                return apply_filters( 'is_email', false, $email, 'domain_period_limits' );
     1336        }
     1337
     1338        // Split the domain into subs
     1339        $subs = explode( '.', $domain );
     1340
     1341        // Assume the domain will have at least two subs
     1342        if ( 2 > count( $subs ) ) {
     1343                return apply_filters( 'is_email', false, $email, 'domain_no_periods' );
     1344        }
     1345
     1346        // Loop through each sub
     1347        foreach ( $subs as $sub ) {
     1348                // Test for leading and trailing hyphens and whitespace
     1349                if ( trim( $sub, " \t\n\r\0\x0B-" ) !== $sub ) {
     1350                        return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
    13101351                }
    1311         } else {
    1312                 return false;
     1352
     1353                // Test for invalid characters
     1354                if ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) {
     1355                        return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' );
     1356                }
    13131357        }
     1358
     1359        // DNS
     1360        // Check the domain has a valid MX and A resource record
     1361        if ( $check_dns && function_exists( 'checkdnsrr' ) && !( checkdnsrr( $domain . '.', 'MX' ) || checkdnsrr( $domain . '.', 'A' ) ) ) {
     1362                return apply_filters( 'is_email', false, $email, 'dns_no_rr' );
     1363        }
     1364
     1365        // Congratulations your email made it!
     1366        return apply_filters( 'is_email', $email, $email, null );
    13141367}
    13151368
    13161369/**
     
    14481501 * @param string $email Email address to filter.
    14491502 * @return string Filtered email address.
    14501503 */
    1451 function sanitize_email($email) {
    1452         return preg_replace('/[^a-z0-9+_.@-]/i', '', $email);
     1504function sanitize_email( $email )
     1505{
     1506        // Test for the minimum length the email can be
     1507        if ( strlen( $email ) < 3 ) {
     1508                return apply_filters( 'sanitize_email', '', $email, 'email_too_short' );
     1509        }
     1510
     1511        // Test for an @ character after the first position
     1512        if ( strpos( $email, '@', 1 ) === false ) {
     1513                return apply_filters( 'sanitize_email', '', $email, 'email_no_at' );
     1514        }
     1515
     1516        // Split out the local and domain parts
     1517        list( $local, $domain ) = explode( '@', $email, 2 );
     1518
     1519        // LOCAL PART
     1520        // Test for invalid characters
     1521        $local = preg_replace( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', '', $local );
     1522        if ( '' === $local ) {
     1523                return apply_filters( 'sanitize_email', '', $email, 'local_invalid_chars' );
     1524        }
     1525
     1526        // DOMAIN PART
     1527        // Test for sequences of periods
     1528        $domain = preg_replace( '/\.{2,}/', '', $domain );
     1529        if ( '' === $domain ) {
     1530                return apply_filters( 'sanitize_email', '', $email, 'domain_period_sequence' );
     1531        }
     1532
     1533        // Test for leading and trailing periods and whitespace
     1534        $domain = trim( $domain, " \t\n\r\0\x0B." );
     1535        if ( '' === $domain ) {
     1536                return apply_filters( 'sanitize_email', '', $email, 'domain_period_limits' );
     1537        }
     1538
     1539        // Split the domain into subs
     1540        $subs = explode( '.', $domain );
     1541
     1542        // Assume the domain will have at least two subs
     1543        if ( 2 > count( $subs ) ) {
     1544                return apply_filters( 'sanitize_email', '', $email, 'domain_no_periods' );
     1545        }
     1546
     1547        // Create an array that will contain valid subs
     1548        $new_subs = array();
     1549
     1550        // Loop through each sub
     1551        foreach ( $subs as $sub ) {
     1552                // Test for leading and trailing hyphens
     1553                $sub = trim( $sub, " \t\n\r\0\x0B-" );
     1554
     1555                // Test for invalid characters
     1556                $sub = preg_replace( '/^[^a-z0-9-]+$/i', '', $sub );
     1557
     1558                // If there's anything left, add it to the valid subs
     1559                if ( '' !== $sub ) {
     1560                        $new_subs[] = $sub;
     1561                }
     1562        }
     1563
     1564        // If there aren't 2 or more valid subs
     1565        if ( 2 > count( $new_subs ) ) {
     1566                return apply_filters( 'sanitize_email', '', $email, 'domain_no_valid_subs' );
     1567        }
     1568
     1569        // Join valid subs into the new domain
     1570        $domain = join( '.', $new_subs );
     1571
     1572        // Put the email back together
     1573        $email = $local . '@' . $domain;
     1574
     1575        // Congratulations your email made it!
     1576        return apply_filters( 'sanitize_email', $email, $email, null );
    14531577}
    14541578
    14551579/**