<meta charset="utf-8"><?php
// 条件1:第一个字符必须是英文或数字或下划线 用哪个字符串函数?
// 条件2:必须包含一个@ 字符串函数是?
// 条件3:包含一个以上 . 符
// 条件4:@符在.符前
// 条件5:不能以@或.符结尾
// 条件6:长度不能长于30 这个知道 用mb_strlen
function is_ok_email($email)
{
$s = substr($email,0,1);//载取第一个字符
$x = ord($s);//第一个字符转为ASCII码
//查ASCII码表得知:
//小写英文的ASCII码范围是97-122
//大写英文的ASCII码范围是65-90
//0-9数字的ASCII码范围是48-57
//下划线的ASCII码是95
//因此可以用下面的条件判断
if
(
($x > 96 && $x < 123) ||
($x > 64 && $x < 91 ) ||
($x > 47 && $x < 58 ) ||
$x == 95
)
{//过了第一关
$x1 = strpos($email,'@');
if($x1)
{//过了第二关
$x2 = strpos($email,'.');
if($x2)
{//过了第三关
if($x2 > $x1)
{//过了第四关
$s = substr($email,strlen($email)-1,1);//载取最后一字符
if($s != '.' && $s != '@')
{//过了第五关
if(strlen($email)< 30)
{//过了第六关
return true;
}
}
}
}
}
}
return false;
}$test[] = '测试[email protected]';
$test[] = 'qqqqq.com';
$test[] = 'qqqqqcom';
$test[] = 'qqqqq.@com';
$test[] = 'qqqqq.@com@';
$test[] = 'qqqqq.@com@.';
$test[] = '[email protected].';
$test[] = '[email protected]';
$test[] = '[email protected]';foreach($test as $v)
{
echo $v;
if(is_ok_email($v))
{
echo '是正确的email';
}else
{
echo '不是正确的email';
}
echo '<br>';
}

解决方案 »

  1.   

    闲了练练手,不一定对<?php
    function is_email_string($s)
    {
        if (!is_string($s) || (($len = strlen($s)) < 3))
        {
            return false;
        }
        
        if($len > 30) {
            return false;
        }    $lb = $len - 1;
        $state = 0;
        $dot_count = [0, 0];    for ($i = 0; $i < $len; $i++)
        {
            $c = $s[$i];
            if ($c == '.')
            {
                if ($i == 0 || $i == $lb)
                {
                    return false;
                }
                $dot_count[$state]++;
            }
            elseif ($c == '@')
            {
                if ($state != 0 || $i == 0 || $i == $lb)
                {
                    return false;
                }
                $state = 1;
                continue;
            }
        }    if ($dot_count[0] > 0 || $dot_count[1] < 1)
        {
            return false; // 按楼主要求,.出现在@前或没有.出现在@后就算错误
        }    return true;
    }$x = '12@163com';
    var_dump(is_email_string($x));
      

  2.   

    大神啊,刚刚发现个问题,strpos是查找字符串首次出现的位置 比如说我输入个地址:123@[email protected] 这样也会通过哦.
      

  3.   

    再来个,可以继续改进<?phpfunction is_email_string($s)
    {
        if (!is_string($s) || (($len = strlen($s)) < 3) || $len > 30)
        {
            return false;
        }    $lb = $len - 1;
        $state = 0;
        $dot_count = [0, 0];    for ($i = 0; $i < $len; $i++)
        {
            $c = $s[$i];
            if ($c == '.')
            {
                if ($i == 0 || $i == $lb)
                {
                    return false;
                }
                $dot_count[$state]++;
            }
            elseif ($c == '@')
            {
                if ($state != 0 || $i == 0 || $i == $lb)
                {
                    return false;
                }
                $state = 1;
                continue;
            }
            elseif (!($c == '_' || ($c >= 'a' && $c <= 'z') || ($c >= 'A' && $c <= 'Z') || ($c >= '0' && $c <= '9')))
            {
                return false;
            }
        }    if ($dot_count[0] > 0 || $dot_count[1] < 1)
        {
            return false;
        }    return true;
    }$x = '[email protected]';
    var_dump(is_email_string($x));
      

  4.   

    条件1:第一个字符必须是英文或数字或下划线 用哪个字符串函数?
    if($email{0} == '_' || ($email{0} >= '0' && $email{0} <=9) || (strtoupper($email{0}) >= 'A' || strtoupper($email{0}) <= 'Z')条件2:必须包含一个@ 字符串函数是?
    if(substr_count($email, '@') == 1)条件3:包含一个以上 . 符
    if(substr_count($email, '.') >= 1)条件4:@符在.符前
    if(strpos($email, '@') < strpos($emai, '.'))条件5:不能以@或.符结尾
    if(substr($email, -1) != '@' && substr($email, -1) != '.')条件6:长度不能长于30 这个知道 用mb_strlen
    if(strlen($eamil) <= 30)
      

  5.   

    判断这些,其实并不一定要一项一项来,它们是可以关联到一起的,思路不用太窄。
    如果一定要用各种函数,像explode('@', $email),得到的数组长度是二说明必只有一个@,再简单判断两个元素的内容,就可以达到目的。