ইমেল ঠিকানাগুলি যাচাই করার জন্য আমার এই ফাংশনটি রয়েছে:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
ইমেল ঠিকানাটি বৈধ কিনা তা যাচাই করার জন্য এটি কি ঠিক আছে?
ইমেল ঠিকানাগুলি যাচাই করার জন্য আমার এই ফাংশনটি রয়েছে:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
ইমেল ঠিকানাটি বৈধ কিনা তা যাচাই করার জন্য এটি কি ঠিক আছে?
উত্তর:
কোনও ইমেল ঠিকানাটি সুগঠিত কিনা তা যাচাই করার সহজ ও নিরাপদ উপায় হল filter_var()ফাংশনটি ব্যবহার করা :
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
অতিরিক্তভাবে আপনি পরীক্ষা করতে পারেন যে ডোমেনটি একটি MXরেকর্ড সংজ্ঞায়িত করেছে :
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
তবে এটি এখনও গ্যারান্টি দেয় না যে মেলটি বিদ্যমান। এটির সন্ধানের একমাত্র উপায় হ'ল একটি নিশ্চিতকরণ মেল পাঠানো।
এখন আপনি যদি আপনার সহজ উত্তরটি ইমেল ঠিকানার বৈধতা সম্পর্কে নির্দ্বিধায় পড়েন তবে আপনি যদি শিখতে আগ্রহী হন বা অন্যথায় কেবল দ্রুত উত্তরটি ব্যবহার করেন এবং এগিয়ে যান। কঠোরানুভুতি নেই.
একটি রেগেক্স ব্যবহার করে কোনও ইমেল ঠিকানা বৈধ করার চেষ্টা করা একটি "অসম্ভব" কাজ। আমি যতদূর যেতে চাই যে আপনি তৈরি করেছেন রেজিএক্স অকেজো। ইমেল ঠিকানা সম্পর্কে তিনটি আরএফসি রয়েছে এবং ভুল ইমেল ঠিকানাগুলিকে ধরার জন্য একটি রেজেেক্স লিখতে হয় এবং একই সাথে মিথ্যা ধনাত্মকতা থাকে না যা নশ্বর কিছু করতে পারে না। পিএইচপি এর ফাংশন দ্বারা ব্যবহৃত রেজেক্সের পরীক্ষার জন্য (ব্যর্থ এবং সফল উভয়) এই তালিকাটি দেখুন Checkfilter_var()
এমনকি বিল্ট-ইন পিএইচপি ফাংশন, ইমেল ক্লায়েন্ট বা সার্ভারগুলি এটি সঠিকভাবে পায় না। এখনও বেশিরভাগ ক্ষেত্রেই filter_varসেরা বিকল্প।
আপনি যদি জানতে চান যে পিএইচপি (বর্তমানে) কোন রেজেক্স প্যাটার্নটি ইমেল ঠিকানাগুলি যাচাই করতে ব্যবহার করে পিএইচপি উত্সটি দেখুন ।
আপনি যদি ইমেল ঠিকানাগুলি সম্পর্কে আরও জানতে চান তবে আমি আপনাকে চশমা পড়া শুরু করার পরামর্শ দিই, তবে আপনাকে সতর্ক করতে হবে এটি কোনও প্রসারিত দ্বারা পড়া সহজ নয়:
নোট যেটি filter_var()ইতিমধ্যে কেবলমাত্র পিএইচপি 5.2 হিসাবে উপলব্ধ রয়েছে stated আপনি যদি পিএইচপি এর পূর্ববর্তী সংস্করণগুলির সাথে এটি কাজ করতে চান তবে আপনি পিএইচপি-তে ব্যবহৃত রেজেক্স ব্যবহার করতে পারেন:
<?php
$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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
পিএস উপরে ব্যবহৃত পিগ্রেস প্যাটার্নের একটি নোট (পিএইচপি উত্স থেকে)। দেখে মনে হচ্ছে মাইকেল রুশনের কিছু কপিরাইট রয়েছে । যেমনটি বলা হয়েছে: "এই কোডটি ব্যবহার করতে এবং পুনরায় বিতরণ করতে নির্দ্বিধায় But তবে দয়া করে এই কপিরাইট বিজ্ঞপ্তিটি রাখুন" "
filter_varতারা এই মুহূর্তে এটি পরিবর্তন করলেও বেশ কিছু সময়ের পরে পিছিয়ে যাবে (আমি একটি বাগ রিপোর্ট পোস্ট করেছি)।
আপনি এর জন্য ফিল্টার_ভার ব্যবহার করতে পারেন ।
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
আমার অভিজ্ঞতায়, regexসমাধানগুলিতে অনেকগুলি মিথ্যা ইতিবাচক থাকে এবং filter_var()সমাধানগুলিতে মিথ্যা নেগেটিভ থাকে (বিশেষত নতুন টিএলডিগুলির সাথে সমস্ত )।
পরিবর্তে, ঠিকানায় ইমেল ঠিকানার প্রয়োজনীয় সমস্ত অংশ (ব্যবহারকারী, "@" প্রতীক এবং ডোমেন) রয়েছে তা নিশ্চিত করে নেওয়া ভাল, তারপরে ডোমেনটি নিজে থেকেই রয়েছে কিনা তা যাচাই করুন।
কোনও বহিরাগত ডোমেনের জন্য কোনও ইমেল ব্যবহারকারী উপস্থিত থাকলে তা (সার্ভার সাইড) নির্ধারণ করার কোনও উপায় নেই।
এটি একটি পদ্ধতি যা আমি একটি ইউটিলিটি ক্লাসে তৈরি করেছি:
public static function validateEmail($email)
{
// SET INITIAL RETURN VARIABLES
$emailIsValid = FALSE;
// MAKE SURE AN EMPTY STRING WASN'T PASSED
if (!empty($email))
{
// GET EMAIL PARTS
$domain = ltrim(stristr($email, '@'), '@') . '.';
$user = stristr($email, '@', TRUE);
// VALIDATE EMAIL ADDRESS
if
(
!empty($user) &&
!empty($domain) &&
checkdnsrr($domain)
)
{$emailIsValid = TRUE;}
}
// RETURN RESULT
return $emailIsValid;
}
stristrএকাধিক @ চিহ্ন থাকলে ডোমেনটি পেতে ব্যর্থ হবে। আরও ভাল explode('@',$email)এবং এটি যাচাই করা উচিতsizeof($array)==2
checkdnsrr()প্রত্যাবর্তন করবে যদি ডোমেনে কোনও @ সাইন থাকে।
আমার মনে হয় আপনি পিএইচপি-র অন্তর্নির্মিত ফিল্টারগুলি ব্যবহার করে ভাল হতে পারেন - এই বিশেষ ক্ষেত্রে:
এটি পরম সরবরাহ করার সাথে একটি সত্য বা মিথ্যা ফিরিয়ে দিতে পারে FILTER_VALIDATE_EMAIL।
এটি কেবল আপনার ইমেলকে বৈধতা দেবে না, তবে এটি অপ্রত্যাশিত অক্ষরের জন্য স্যানিটাইজও করবে:
$email = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
$emailB != $email
) {
echo "This email adress isn't valid!";
exit(0);
}
ইমেল যাচাইকরণ সম্পর্কে 'শীর্ষ প্রশ্নে' এর উত্তর https://stackoverflow.com/a/41129750/1848217
আমার জন্য ইমেল চেক করার সঠিক উপায় হ'ল:
- @ চিহ্নটি উপস্থিত রয়েছে এবং তার আগে এবং পরে কিছু অ-@ চিহ্ন রয়েছে তা পরীক্ষা করে দেখুন:
/^[^@]+@[^@]+$/- কিছু "অ্যাক্টিভেশন কোড" দিয়ে এই ঠিকানায় একটি ইমেল প্রেরণের চেষ্টা করুন।
- যখন ব্যবহারকারী তার ইমেল ঠিকানা "সক্রিয়" করে, আমরা দেখব যে সব ঠিক আছে।
অবশ্যই, ব্যবহারকারীরা সাধারণ ভুলগুলি এড়াতে সহায়তা করার জন্য "অদ্ভুত" ইমেলটি টাইপ করার সময় আপনি ফ্রন্ট-এন্ডে কিছু সতর্কতা বা সরঞ্জামদণ্ড প্রদর্শন করতে পারেন, যেমন ডোমেন অংশে কোনও বিন্দু বা উদ্ধৃতি না দিয়ে নামে ফাঁকা স্থান ইত্যাদি। তবে ব্যবহারকারী যদি সত্যিই এটি চান তবে আপনাকে অবশ্যই "হ্যালো @ ওয়ার্ল্ড" ঠিকানাটি গ্রহণ করতে হবে।
এছাড়াও, আপনাকে অবশ্যই মনে রাখতে হবে যে ইমেল ঠিকানার মানটি ছিল এবং বিবর্তিত হতে পারে, তাই আপনি একবার এবং সর্বকালের জন্য কিছু "স্ট্যান্ডার্ড-বৈধ" রিজেক্স্প টাইপ করতে পারবেন না। এবং আপনাকে অবশ্যই মনে রাখতে হবে যে কিছু কংক্রিট ইন্টারনেট সার্ভারগুলি সাধারণ মানের কিছু বিবরণ ব্যর্থ করতে পারে এবং প্রকৃতপক্ষে নিজের "পরিবর্তিত মান" দিয়ে কাজ করতে পারে।
সুতরাং, কেবলমাত্র @, সামনের দিকে ব্যবহারকারীকে ইঙ্গিত করুন এবং প্রদত্ত ঠিকানায় যাচাইকরণ ইমেলগুলি প্রেরণ করুন।
@করে না, তবে এটি সত্যই এটি পরীক্ষা করে না যে ইমেল পরিচালনা করে এমন কোনও আরএফসি-র প্রতি এটি বৈধ। এটি লিখিত হিসাবে কাজ করে না। আমি এটি regex101.com এর মাধ্যমে চালিয়েছি এবং এটি বৈধ ঠিকানাগুলির সাথে মেলে ব্যর্থ হয়েছে
/^[^@]+@[^@+]$/করতে/^[^@]+@[^@]+$/
filter_varপদ্ধতিতে উন্নতি হয় ? এটি খারাপভাবে ফর্ম্যাট করা ঠিকানাগুলি গ্রহণ করার সমস্যা সমাধান করে না। আপনার রেজেক্স আনন্দের joe@domainসাথে একটি বৈধ ইমেল ঠিকানা হিসাবে গ্রহণ করবে , যখন তা নয়
filter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)। তবে সার্ভারে আপনার পুরানো ফাংশন রয়েছে, আপনি কিছু ক্ষেত্রে আপডেট করতে পারবেন না। এবং আপনি কিছু নতুন বৈধ ইমেল সহ ক্লায়েন্টদের শিথিল করবেন। এছাড়াও, আমি আরও একবার লক্ষ্য করেছি, সমস্ত ইমেল-পরিবেশনকারী সেভারগুলি ইমেল ঠিকানাগুলির সাধারণ এবং আধুনিক মান অনুসারে কঠোরভাবে কাজ করে না।
আপনি যদি ইমেল ঠিকানা থেকে প্রদত্ত ডোমেনটি বৈধ কিনা তা পরীক্ষা করতে চান তবে এই জাতীয় কিছু ব্যবহার করুন:
/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
function check_email_domain($email) {
//Get host name from email and check if it is valid
$email_host = explode("@", $email);
//Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
$host = end($email_host) . ".";
//Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)
}
}
স্ট্যান্ডার্ড ইমেইল বৈধতা সহ অনেকগুলি অবৈধ ইমেল ঠিকানা ফিল্টার করার সহজ উপায়, কারণ বৈধ ইমেল ফর্ম্যাটটির অর্থ বৈধ ইমেল নয় ।
মনে রাখবেন যে idn_to_ascii()(বা তার বোন ফাংশন idn_to_utf8()) ফাংশনটি আপনার পিএইচপি ইনস্টলেশনতে উপলব্ধ নাও থাকতে পারে , এর জন্য পিইসিএল ইন্টেল> = 1.0.2 এবং পিইসিএল আইডিএন = = 0.1 দরকার।
এছাড়াও মনে রাখবেন যে আইপিভি 4 বা আইপিভি 6 ইমেলের ডোমেন অংশ হিসাবে (উদাহরণস্বরূপ user@[IPv6:2001:db8::1]) যাচাই করা যায় না, কেবল নামকরণ করা হোস্টই পারে।
আরও এখানে দেখুন ।
এখানে উত্তরগুলি পড়ার পরে, আমি এখানেই শেষ করেছি:
public static function isValidEmail(string $email) : bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host,FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host.'.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
return false;
}
}
return true;
}
আপনি শুধু প্রকৃত Regex বিভিন্ন বিন্দু, আন্ডারস্কোর এবং ড্যাশ জন্য করতে পারবেন খুঁজছেন, তাহলে এটি নিম্নরূপ: [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+। এটি মোটামুটি বোকা দেখাচ্ছে ইমেলটি tom_anderson.1-neo@my-mail_matrix.comযাচাই করার অনুমতি দেবে ।
/(?![[:alnum:]]|@|-|_|\.)./
আজকাল, আপনি যদি এইচটিএমএল 5 ফর্ম ব্যবহার করেন type=emailতবে আপনি ইতিমধ্যে 80% সুরক্ষিত থাকায় ব্রাউজার ইঞ্জিনগুলির নিজস্ব বৈধকরণকারী রয়েছে। এটির পরিপূরক হিসাবে, এই রেজেক্সটিকে আপনার যুক্ত করুন preg_match_all()এবং এটি অস্বীকার করুন:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
Https://regex101.com/r/mPEKmy/1 বৈধতার জন্য এইচটিএমএল 5 ফর্মগুলির দ্বারা ব্যবহৃত রেজেক্সটি সন্ধান করুন
validateEmailকেরেট হবে, পাশাপাশি পাশ করাও হবে$emailনা$EMAIL।