Source View: is_email

To save our bandwidth, we show only a snippet of code around each occurence of the hook. View complete file in SVN (without highlighting).

Understanding Source Code

The best way to understand what a hook does is to look at where it occurs in the source code.

  • Action hooks look like this: do_action( "hook_name" )
  • Filter hooks look like this: apply_filters( "hook_name", "what_to_filter" ).

Remember, this hook may occur in more than one file. Moreover, the hook's context may change from version to version.

Source View

This hook occurs 10 times in this file.

Line Code
1363  * @since 0.71
1364  *
1365  * @param string $email Email address to verify.
1366  * @param boolean $check_dns Whether to check the DNS for the domain using checkdnsrr().
1367  * @return string|bool Either false or the valid email address.
1368  */
1369 function is_email( $email, $check_dns = false ) {
1370      // Test for the minimum length the email can be
1371      if ( strlen( $email ) < 3 ) {
1372           return apply_filters( 'is_email', false, $email, 'email_too_short' );
1373      }
1374
1375      // Test for an @ character after the first position
1376      if ( strpos( $email, '@', 1 ) === false ) {
1377           return apply_filters( 'is_email', false, $email, 'email_no_at' );
1378      }
1379
1380      // Split out the local and domain parts
1381      list( $local, $domain ) = explode( '@', $email, 2 );
1382
1383      // LOCAL PART
1384      // Test for invalid characters
1385      if ( !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local ) ) {
1386           return apply_filters( 'is_email', false, $email, 'local_invalid_chars' );
1387      }
1388
1389      // DOMAIN PART
1390      // Test for sequences of periods
1391      if ( preg_match( '/\.{2,}/', $domain ) ) {
1392           return apply_filters( 'is_email', false, $email, 'domain_period_sequence' );
1393      }
1394
1395      // Test for leading and trailing periods and whitespace
1396      if ( trim( $domain, " \t\n\r\0\x0B." ) !== $domain ) {
1397           return apply_filters( 'is_email', false, $email, 'domain_period_limits' );
1398      }
1399
1400      // Split the domain into subs
1401      $subs = explode( '.', $domain );
1402
1403      // Assume the domain will have at least two subs
1404      if ( 2 > count( $subs ) ) {
1405           return apply_filters( 'is_email', false, $email, 'domain_no_periods' );
1406      }
1407
1408      // Loop through each sub
1409      foreach ( $subs as $sub ) {
1410           // Test for leading and trailing hyphens and whitespace
1411           if ( trim( $sub, " \t\n\r\0\x0B-" ) !== $sub ) {
1412                return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
1413           }
1414
1415           // Test for invalid characters
1416           if ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) {
1417                return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' );
1418           }
1419      }
1420
1421      // DNS
1422      // Check the domain has a valid MX and A resource record
1423      if ( $check_dns && function_exists( 'checkdnsrr' ) && !( checkdnsrr( $domain . '.', 'MX' ) || checkdnsrr( $domain . '.', 'A' ) ) ) {
1424           return apply_filters( 'is_email', false, $email, 'dns_no_rr' );
1425      }
1426
1427      // Congratulations your email made it!
1428      return apply_filters( 'is_email', $email, $email, null );
1429 }
1430
1431 /**
1432  * Convert to ASCII from email subjects.
1433  *
1434  * @since 1.2.0
1435  * @usedby wp_mail() handles charsets in email subjects
1436  *
1437  * @param string $string Subject line