কীভাবে পিএইচপি তে কোনও ইমেল যাচাই করবেন?


120

আমি কীভাবে ইনপুট মানটি যাচাই করতে পারি php5 ব্যবহার করে একটি বৈধ ইমেল ঠিকানা। এখন আমি এই কোডটি ব্যবহার করছি

function isValidEmail($email){ 
     $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; 

     if (eregi($pattern, $email)){ 
        return true; 
     } 
     else { 
        return false; 
     }    
} 

তবে এটি হ্রাস করা ত্রুটি দেখায়। আমি কীভাবে এই সমস্যাটি ঠিক করতে পারি। আমাকে সাহায্য করুন.


3
ইতিমধ্যে সঠিক উত্তর দেওয়া হয়েছিল, তবে অবহেলিত ইস্যু সম্পর্কিত: POSIX নিয়মিত এক্সপ্রেশন (যা eregiএকটি ফাংশন) এর ব্যবহার হ্রাস করা হয়। ব্যবহারের PCRE পরিবর্তে।
ফেলিক্স ক্লিং

3
যাইহোক, আপনার রেজেক্স সম্পূর্ণ ভুল। কিছু সম্পূর্ণ বৈধ ঠিকানা আপনার ফাংশন দ্বারা অবৈধ হিসাবে চিহ্নিত করা হবে। একটি রেজেক্সের সাথে ইমেল অ্যাড্রেস ফিল্টার করা দুঃস্বপ্ন।
আর্টফ্যাক্ট

আপনার আরএফসি 822 মান ব্যবহার করা উচিত এবং পিএইচপি-তে ইমেল অ্যাড্রেসগুলি পার্সিংয়ের একটি ভাল নিবন্ধ এখানে এটি ব্যাখ্যা করেছে।
কেটিএ

উত্তর:


275

আপনি filter_var()ফাংশনটি ব্যবহার করতে পারেন যা আপনাকে প্রচুর পরিমাণে কার্যকর বৈধতা এবং স্যানিটাইজেশন বিকল্প দেয়।

filter_var($email, FILTER_VALIDATE_EMAIL)

আপনি যদি নিজের ফাংশনের উপর নির্ভর করে আপনার কোডটি পরিবর্তন করতে না চান তবে কেবল করুন:

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

দ্রষ্টব্য : অন্যান্য ব্যবহারের জন্য (যেখানে আপনার রেইজেক্স প্রয়োজন), অবহিত ফাংশন পরিবার ( পসিক্স রেজেক্স ফাংশন ) পরিবার ( পিসিআরই রেজেক্স ফাংশন ) eregদ্বারা প্রতিস্থাপন করা উচিত । স্বল্প পরিমাণে পার্থক্য রয়েছে, ম্যানুয়ালটি পড়া যথেষ্ট shouldpreg

আপডেট 1 : @ বাইনারিএলভি দ্বারা চিহ্নিত হিসাবে :

পিএইচপি 5.3.3 এবং 5.2.14 এ FILTER_VALIDATE_EMAIL সম্পর্কিত একটি বাগ ছিল , যার ফলে বড় মানগুলি বৈধকরণের সময় সেগফল্ট হয় । এর জন্য সহজ এবং নিরাপদ কাজের strlen() আগে ব্যবহার করা হচ্ছে filter_var()। আমি 5.3.4 চূড়ান্ত সম্পর্কে নিশ্চিত নই, তবে এটি লিখিত আছে যে 5.3.4-স্ন্যাপশটের কিছু সংস্করণও প্রভাবিত হয়েছিল।

এই বাগটি ইতিমধ্যে ঠিক করা হয়েছে।

আপডেট 2 : এই পদ্ধতিটি অবশ্যই bazmega@kapaএকটি বৈধ ইমেল ঠিকানা হিসাবে বৈধ হবে, কারণ বাস্তবে এটি একটি বৈধ ইমেল ঠিকানা। কিন্তু ইন্টারনেটে অধিকাংশ সময়, এছাড়াও আপনি এই ইমেল ঠিকানাটি একটি টিএলডি আছে চাই: bazmega@kapa.com। যেমনটি এই ব্লগ পোস্টে পরামর্শ দেওয়া হয়েছে ( @ ইসতিয়াক আহমেদ পোস্ট করা লিংক ), আপনি filter_var()একটি রেইগেক্সের সাহায্যে বাড়িয়ে নিতে পারেন যা ডোমেন অংশে একটি বিন্দুর অস্তিত্বের জন্য যাচাই করবে ( যদিও কোনও বৈধ টিএলডি পরীক্ষা করবে না ):

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

হিসাবে @Eliseo Ocampos নির্দিষ্ট, এই সমস্যা শুধু পিএইচপি 5.3 সামনে বিদ্যমান, যে সংস্করণে তারা Regex পরিবর্তিত এবং যাতে আপনি করতে হবে না এখন এটি এই চেক করে,।


4
+1 এটি বলেছিল, আপনি উল্লেখ করতে চাইতে পারেন এটি কেবলমাত্র পিএইচপি 5.2.x এবং এর উপরের ক্ষেত্রে উপলব্ধ। :-)
জন পার্কার

5
@ মিদ্দাপারকা: ওপি যেমন একটি অবহেলিত বার্তা পেয়েছে eregi, মনে হচ্ছে তিনি পিএইচপি 5.3 ব্যবহার করছেন। তবে হ্যাঁ, এটি উল্লেখ করা গুরুত্বপূর্ণ (অন্যদের জন্য)।
ফেলিক্স ক্লিং

8
পিএইচপি 5.3.3 এবং 5.2.14 এর সাথে সম্পর্কিত একটি বাগ ( বাগস.এফপি.এন.পি। / 292929 ) ছিল FILTER_VALIDATE_EMAIL, যার ফলে বড় মানগুলি বৈধকরণের সময় সেগফল্ট হয় । এর জন্য সহজ এবং নিরাপদ কাজের strlen()আগে ব্যবহার করা হচ্ছে filter_val()। আমি 5.3.4 চূড়ান্ত সম্পর্কে নিশ্চিত নই, তবে এটি লিখিত আছে যে 5.3.4-স্ন্যাপশটের কিছু সংস্করণও প্রভাবিত হয়েছিল।
বাইনারিএলভি

1
@ বাইনারিএলভি, filter_valনাকি filter_var?
ইসতিয়াক আহমেদ

3
@ কেপা, প্রকৃতপক্ষে ডোমেন অংশে কোনও ডট পরীক্ষা করার জন্য আপনার আর কোনও দরকার নেই। দেখুন svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
এলিসিও ওকাম্পোস

9

Http://www.php.net/manual/en/function.ereg.php এ নোটগুলি দেখুন :

Note:

পিএইচপি 5.3.0 হিসাবে, রেজেক্স এক্সটেনশনটি পিসিআরই এক্সটেনশনের পক্ষে অবচয় করা হয়েছে । এই ফাংশনটিতে কল করা একটি E_DEPRECATED বিজ্ঞপ্তি প্রকাশ করবে। পিসিআরইতে রূপান্তর করতে সহায়তার জন্য পার্থক্যের তালিকাটি দেখুন ।

Note:

প্রেগ_ম্যাচ () , যা পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন সিনট্যাক্স ব্যবহার করে, প্রায়শই ইরেগ () এর দ্রুত বিকল্প হয়।


7

এটি পুরানো পোস্ট তবে আমি আমার সমাধানটি ভাগ করে নেব কারণ এখানে একটি সমস্যা আগেই উল্লেখ করা হয়নি।

নতুন ইমেল ঠিকানা হল UTF-8 টি অক্ষর বা তার মত বিশেষ ডোমেন নাম ধারণ করতে পারে .live, .newsইত্যাদি

এছাড়াও আমি দেখতে পেয়েছি যে কিছু ইমেল ঠিকানা সিরিলিক এবং সমস্ত ক্ষেত্রে স্ট্যান্ডার্ড রেজেক্সে থাকতে পারে বা filter_var()ব্যর্থ হবে।

এজন্যই আমি এর জন্য একটি সমাধান করেছি:

function valid_email($email) 
{
    if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
        return false;
    else
    {
        $email=trim(strtolower($email));
        if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
        else
        {
            $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
            return (preg_match($pattern, $email) === 1) ? $email : false;
        }
    }
}

এই ফাংশনটি সমস্ত ক্ষেত্রে এবং ইমেল ফর্ম্যাটগুলির জন্য নিখুঁতভাবে কাজ করে।


3

আমি সর্বদা এটি ব্যবহার করি:

function validEmail($email){
    // First, we check that there's one @ symbol, and that the lengths are right
    if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
        // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
        return false;
    }
    // Split it into sections to make life easier
    $email_array = explode("@", $email);
    $local_array = explode(".", $email_array[0]);
    for ($i = 0; $i < sizeof($local_array); $i++) {
        if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
            return false;
        }
    }
    if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
        $domain_array = explode(".", $email_array[1]);
        if (sizeof($domain_array) < 2) {
            return false; // Not enough parts to domain
        }
        for ($i = 0; $i < sizeof($domain_array); $i++) {
            if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
                return false;
            }
        }
    }

    return true;
}

1
@ আনব্রেক আমি আপনার কোডটি চেষ্টা করে দেখেছি যে আপনি যদি ইমেলটি পাস করেন alex@.তবে এটি কোনও বৈধ ইমেল ঠিকানা নয় যেখানে এটি সর্বদা সত্য ফিরে আসে।
শুভজিৎ


1

ব্যবহার করুন:

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
$validator = new EmailValidator();
$multipleValidations = new MultipleValidationWithAnd([
    new RFCValidation(),
    new DNSCheckValidation()
]);
$validator->isValid("example@example.com", $multipleValidations); //true

0

একজন ভাল ডেভলপারের জন্য ব্যবহারকারীর ডেটা অত্যন্ত গুরুত্বপূর্ণ, তাই একই তথ্য বারবার জিজ্ঞাসা করবেন না, ডেটাতে কিছু প্রাথমিক ত্রুটি সংশোধন করতে কিছু যুক্তি ব্যবহার করুন।

ইমেলের বৈধতার আগে: প্রথমে আপনাকে ইমেল থেকে সমস্ত অবৈধ অক্ষর মুছে ফেলতে হবে।

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

এর পরে এই filter_var()ফাংশনটি ব্যবহার করে আপনার ইমেল ঠিকানাটি বৈধ করুন ।

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

যেমন যেমন

<?php
$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo $email." is a valid email address";
} else {
    echo $email." is not a valid email address";
}
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.