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


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.