PHP में एक ईमेल पते को कैसे मान्य करें


218

मेरे पास ईमेल पतों को मान्य करने के लिए यह कार्य है:

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

क्या यह जांचने के लिए ठीक है कि ईमेल पता वैध है या नहीं?


1
अगर यह काम करता है तो यह काम करता है। आप वास्तव में इसे बेहतर नहीं बना सकते, यह बहुत छोटा है। केवल एक चीज जो अच्छी नहीं है वह है शैली। validateEmailशव होगा, साथ ही गुजर रहा है $email, नहीं $EMAIL
स्टेन

बस मैं यह सुनिश्चित करना चाहता था कि मुझे कोड में कोई बड़ी समस्या नहीं है :)
कैमरन

ईमेल पते को मान्य करने के लिए नियमित अभिव्यक्ति का उपयोग कैसे और कैसे करें, इसके बारे में अधिक जानने के लिए stackoverflow.com/questions/201323/… को भी देखें ।
लेगोशिया

5
यह कई मान्य ईमेल पतों को मान्य करने में विफल होगा। उदाहरण के लिए *@example.com या ex@example.com या me @ [127.0.0.1] या आप @ [ipv6: 08B0: 1123: AAAA :: 1234]
जेकरोड

7
@ जेकोडर, ऐसा नहीं है कि मैं उस रेगेक्स की सिफारिश कर रहा हूं, लेकिन कम से कम हम उम्मीद कर सकते हैं कि कोई भी व्यक्ति गायन आदि के लिए इस तरह के पते का उपयोग करेगा जब यह विफल हो जाएगा तो शिकायत नहीं करेगा :)
हैल gzgür

जवाबों:


568

यह जाँचने के लिए सबसे आसान और सुरक्षित तरीका है कि ईमेल पता अच्छी तरह से बनाया गया है, filter_var()फ़ंक्शन का उपयोग करना है:

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

इसके अतिरिक्त आप जाँच सकते हैं कि क्या डोमेन एक MXरिकॉर्ड को परिभाषित करता है :

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

लेकिन यह अभी भी गारंटी नहीं देता है कि मेल मौजूद है। यह पता लगाने का एकमात्र तरीका एक पुष्टिकरण मेल भेजकर है।


अब जब आपके पास अपना आसान उत्तर है, तो ईमेल पता सत्यापन के बारे में जानने के लिए स्वतंत्र महसूस करें यदि आप सीखने की परवाह करते हैं या अन्यथा बस तेज़ उत्तर का उपयोग करें और आगे बढ़ें। बुरा न मानो।

रेगेक्स का उपयोग करके एक ईमेल पते को मान्य करने की कोशिश करना एक "असंभव" कार्य है। मैं यह कहना चाहूंगा कि आपने जो रेगेक्स बनाया है, वह बेकार है। Emailaddresses के बारे में तीन rfc हैं और गलत emailadresses को पकड़ने के लिए एक regex लिख रहे हैं और एक ही समय में झूठी सकारात्मकता नहीं है, ऐसा कोई भी व्यक्ति नहीं कर सकता है। PHP के फ़ंक्शन द्वारा उपयोग किए गए regex के परीक्षण (असफल और सफल दोनों) के लिए इस सूची को देखें filter_var()

यहां तक ​​कि अंतर्निहित PHP फ़ंक्शन, ईमेल क्लाइंट या सर्वर इसे सही नहीं पाते हैं। अभी भी ज्यादातर मामलों में सबसे filter_varअच्छा विकल्प है।

यदि आप जानना चाहते हैं कि कौन से रेगेक्स पैटर्न PHP (वर्तमान में) ईमेल पते को मान्य करने के लिए उपयोग करता है तो PHP स्रोत देखें

यदि आप ईमेल पते के बारे में अधिक जानना चाहते हैं, तो मैं आपको चश्मा पढ़ना शुरू करने का सुझाव देता हूं, लेकिन मुझे आपको आगाह करना होगा कि यह किसी भी तरह से आसान नहीं है:

  • rfc5322
  • rfc5321
  • rfc3696
  • rfc6531 (यूनिकोड वर्णों की अनुमति देता है, हालाँकि कई क्लाइंट / सर्वर इसे स्वीकार नहीं करते हैं)

ध्यान दें कि filter_var()जैसा कि पहले ही बताया गया है केवल PHP 5.2 के रूप में उपलब्ध है। यदि आप चाहते हैं कि यह PHP के पुराने संस्करणों के साथ काम करे, तो आप PHP में उपयोग किए गए regex का उपयोग कर सकते हैं:

<?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
}

पीएस ए ऊपर (PHP स्रोत से) regex पैटर्न पर एक नोट। ऐसा लगता है कि माइकल रशटन पर इसका कुछ कॉपीराइट है । जैसा कि कहा गया है: "इस कोड का उपयोग करने और पुनर्वितरित करने के लिए स्वतंत्र महसूस करें। लेकिन कृपया इस कॉपीराइट नोटिस को रखें।"


अच्छा उत्तर, लेकिन इस लिंक के अनुसार: haacked.com/archive/2007/08/21/… । स्थानीय रूप से उपयोगकर्ता नाम o को उद्धृत किया जा सकता है, लेकिन FILTER_VALIDATE_EMAIL इसे स्वीकार नहीं करता है।
डैनियल डी लियोन

3
यह सभी emailaddresses के लिए काम नहीं करता है जैसा कि कहा गया है। मेरे उत्तर में विफल परीक्षणों की सूची भी देखें कि कुछ उद्धृत तार काम करते हैं और अन्य नहीं।
PeeHaa

4
नहीं, उस पैटर्न emailtester.pieterhordijk.com/test-pattern/MTAz :-) पर बहुत सारे विफल परीक्षण
PeeHaa

1
यह पैटर्न उस स्थिति में बेहद जटिल है, जब आपको बड़े ईमेल स्ट्रिंग में "preg_match_all" जैसे फ़ंक्शन का उपयोग करना पड़ता है। यदि आप में से किसी के पास सरलता है तो कृपया साझा करें। मेरा मतलब है यदि आप चाहते हैं: preg_match_all ($ पैटर्न, $ text_string, $ माचिस); यदि आपको वास्तव में बड़े पाठ को पार्स करने की आवश्यकता है तो यह जटिल पैटर्न सर्वर को अधिभारित करेगा।
व्लादो

4
@PeeHaa: पोस्टफ़िक्स 3.0 अब लगभग दो वर्षों के लिए इसका समर्थन करता है: postfix.org/SMTPUTF8_README.html , और यह Ubuntu 16.04 में शामिल है और अगले डेबियन रिलीज में शामिल किया जाएगा, उदाहरण के लिए। एक्जिम को प्रयोगात्मक समर्थन है। जीमेल जैसे वेबमेल प्रदाताओं ने भी ऐसे ईमेल भेजने / प्राप्त करने के लिए समर्थन जोड़ा है, हालाँकि आप अभी तक यूनिकोड खाते नहीं बना सकते हैं। व्यापक उपयोग और समर्थन पहुंच के भीतर है, और filter_varकाफी समय से पिछड़ जाएगा, भले ही वे इसे अभी बदल दें (मैंने एक बग रिपोर्ट पोस्ट की है)।
Iquito

43

इसके लिए आप filter_var का उपयोग कर सकते हैं ।

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>

1
इस फ़ंक्शन को जोड़ना बंद करें क्योंकि यह डोमेन को मान्य नहीं करता है। यदि आप कुछ @ पता जोड़ रहे हैं तो यह मान्य है। और यह नहीं है!
हेरे नेंटु '

सभी एक पंक्ति के कार्यों में एक पंक्ति वाले कार्य क्या हैं? मैं उन्हें हर जगह देख रहा हूं। यह "बात" कब बनी? (बयानबाजी)। इसे रोकने की जरूरत है।
ब्लू वाटर

15

मेरे अनुभव में, regexसमाधानों में बहुत सी झूठी सकारात्मकताएँ हैं और filter_var()समाधानों में झूठी नकारात्मकताएँ हैं (विशेष रूप से सभी नए TLDs के साथ )।

इसके बजाय, यह सुनिश्चित करना बेहतर है कि पते में ईमेल पते (उपयोगकर्ता, "@" प्रतीक और डोमेन) के सभी आवश्यक भाग हैं, फिर सत्यापित करें कि डोमेन स्वयं मौजूद है।

यदि कोई ईमेल उपयोगकर्ता किसी बाहरी डोमेन के लिए मौजूद है, तो यह निर्धारित करने का कोई तरीका नहीं है (सर्वर साइड)।

यह एक ऐसा तरीका है जिसे मैंने उपयोगिता वर्ग में बनाया है:

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;
}

Neverbounce का दावा है कि उनका API 97% डिलीवरी को मान्य करने में सक्षम है। जब तक आप अपने संपर्क डेटाबेस को सौंपने का मन नहीं करते, तब तक अवश्य।
टॉम रसेल

stristrयदि कई @ चिह्न हैं तो डोमेन प्राप्त करने में विफल रहेंगे। इससे बेहतर explode('@',$email)और जाँच करेंsizeof($array)==2
हारून गिल

@AaronGillion जब तक आप डोमेन भागों को प्राप्त करने के लिए एक बेहतर तरीका के रूप में सही हैं, विधि अभी भी झूठी checkdnsrr()वापस आएगी क्योंकि डोमेन में कोई @ चिह्न थे।
जबरी

11

मुझे लगता है कि आप इस विशेष मामले में PHP के इनबिल्ट फिल्टर का उपयोग करके बेहतर हो सकते हैं :

यह FILTER_VALIDATE_EMAILपरम के साथ आपूर्ति किए जाने पर सही या गलत लौटा सकता है ।


9

यह न केवल आपके ईमेल को मान्य करेगा, बल्कि अनपेक्षित वर्णों के लिए इसे पवित्र भी करेगा:

$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);
}

4

ईमेल सत्यापन https://stackoverflow.com/a/41129750/1848217 के बारे में 'शीर्ष प्रश्न' में इसका उत्तर दिया

मेरे लिए ईमेल जाँचने का सही तरीका है:

  1. जाँच करें कि प्रतीक @ मौजूद है, और इससे पहले और उसके बाद कुछ गैर- @ प्रतीक हैं: /^[^@]+@[^@]+$/
  2. कुछ "सक्रियण कोड" के साथ इस पते पर एक ईमेल भेजने की कोशिश करें।
  3. जब उपयोगकर्ता अपने ईमेल पते को "सक्रिय" करता है, तो हम देखेंगे कि सब सही है।

बेशक, आप कुछ गलतियाँ या टूलटिप दिखा सकते हैं जब उपयोगकर्ता सामान्य गलतियों से बचने में मदद करने के लिए "अजीब" ईमेल टाइप करता है, जैसे कि बिना उद्धृत किए डोमेन नेम या स्पेस में डॉट और बिना नाम के। यदि आप उपयोगकर्ता वास्तव में चाहते हैं, तो आपको "हैलो @ वर्ल्ड" का पता स्वीकार करना होगा।

इसके अलावा, आपको यह याद रखना चाहिए कि ईमेल पता मानक था और विकसित हो सकता है, इसलिए आप एक बार और सभी समय के लिए कुछ "मानक-मान्य" regexp टाइप नहीं कर सकते। और आपको याद रखना चाहिए कि कुछ ठोस इंटरनेट सर्वर सामान्य मानक के कुछ विवरणों को विफल कर सकते हैं और वास्तव में स्वयं "संशोधित मानक" के साथ काम करते हैं।

तो, बस चेक करें @, संकेत पर उपयोगकर्ता को इंगित करें और दिए गए पते पर सत्यापन ईमेल भेजें।


1
आपका रेगेक्स के लिए जाँच करता है @, लेकिन यह वास्तव में जाँच नहीं करता है कि यह ईमेल को संचालित करने वाले किसी भी RFC के अनुसार मान्य है। यह लिखित रूप में भी काम नहीं करता है। मैंने इसे regex101.com के माध्यम से चलाया और यह वैध पते से मेल खाने में विफल रहा
मैक्वाटिटी

क्या आप केवल रेगेक्स या पूरे उत्तर को पढ़ते हैं? आपसे पूरी तरह असहमत हैं। कृपया मुझे केवल यह कहें कि RFC gmail.com सर्वर के अनुसार joe@gmail.com और jo.e@gmail.com एक ही पता है? बहुत सारे सर्वर हैं जो मानकों के अनुसार काम करते हैं या FRESH मानकों द्वारा नहीं। लेकिन थाय अपने उपयोगकर्ताओं के ईमेल की सेवा करते हैं। यदि आप कुछ regexp एक बार टाइप करते हैं, और केवल उसी के द्वारा मान्य होते हैं, तो आपको इस बात की कोई गारंटी नहीं है कि यह भविष्य में सही रहेगा और आपके भविष्य के उपयोगकर्ता अपने "नए तरीके" ईमेल के साथ विफल नहीं होंगे। इसलिए, मेरी स्थिति समान है: मुख्य बिंदु यदि आप ईमेल पते को सत्यापित करना चाहते हैं - बस सक्रियण ईमेल भेजें।
फ्लेमस्टॉर्म

@ मेचविटी लेकिन रेगेक्सप में बग्रेपोर्ट के लिए धन्यवाद, मैंने इसे तय /^[^@]+@[^@+]$/किया/^[^@]+@[^@]+$/
फ्लेमस्टॉर्म

Regex को ठीक करने के लिए आपको सहारा देता है, लेकिन यह filter_varविधि पर कैसे सुधार करता है ? यह बुरी तरह से स्वरूपित पते को स्वीकार करने की समस्या को ठीक नहीं करता है। आपका रेगेक्स ख़ुशी से joe@domainएक मान्य ईमेल पते के रूप में स्वीकार करेगा , जब यह नहीं है
Machavity

उदाहरण के लिए, @ मैचविटी, आपके सर्वर पर PHP का एक ठोस संस्करण है और आप इसे नवीनतम में अपडेट नहीं कर सकते। उदाहरण के लिए, आपके पास php 5.5.15 है। 2018 में वैध ईमेल का मानक बढ़ाया गया था। इसका एहसास जल्द ही php 7.3.10 में होगा। और वहाँ अच्छा काम कर समारोह होगा filter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)। लेकिन सर्वर पर आपका पुराना कार्य है, आप कुछ मामलों में अपडेट नहीं कर सकते। और आप कुछ नए मान्य ईमेल के साथ ग्राहकों को ढीला करेंगे। इसके अलावा, एक बार और मैं यह नोटिस करता हूं कि सभी ईमेल सर्व करने वाले सेवर, ईमेल एड्रेन्स के सामान्य और आधुनिक मानक के अनुसार कड़ाई से काम नहीं करते हैं।
फ्लेमस्टॉर्म

3

यदि आप यह जांचना चाहते हैं कि क्या ईमेल पते से डोमेन प्रदान किया गया है, तो मान्य है, जैसे कुछ का उपयोग करें:

/*
* 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()) फ़ंक्शन आपके PHP इंस्टॉलेशन में उपलब्ध नहीं हो सकता है, इसके लिए एक्सटेंशन PECL intl> = 1.0.2 और PECL idn> = 0.1 की आवश्यकता होती है।

यह भी ध्यान रखें कि ईमेल में IPv4 या IPv6 डोमेन भाग के रूप में (उदाहरण के लिए user@[IPv6:2001:db8::1]) को मान्य नहीं किया जा सकता है, जिसे केवल होस्ट्स नाम दिया जा सकता है।

अधिक देखें यहाँ


मुझे नहीं लगता कि यह काम करेगा अगर ईमेल पते का होस्ट हिस्सा आईपी पते में आईपीवी 6 प्रारूप में है
गॉर्डन

2

यहाँ उत्तरों को पढ़ने के बाद, यही मैंने समाप्त किया:

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;
}

1

यदि आप केवल एक वास्तविक रेगेक्स की तलाश कर रहे हैं जो विभिन्न डॉट्स, अंडरस्कोर और डैश के लिए अनुमति देता है, तो यह निम्नानुसार है [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+:। यह एक काफी बेवकूफ लग रही ईमेल tom_anderson.1-neo@my-mail_matrix.comको मान्य करने की अनुमति देगा ।


0
/(?![[:alnum:]]|@|-|_|\.)./

आजकल, यदि आप एचटीएमएल 5 फॉर्म का उपयोग करते हैं, तो आप type=emailपहले से ही 80% सुरक्षित हैं क्योंकि ब्राउज़र इंजन का अपना सत्यापनकर्ता है। इसे पूरक करने के लिए, इस रेगेक्स को अपने साथ जोड़ें preg_match_all()और इसे नकारात्मक करें:

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

सत्यापन के लिए HTML5 रूपों द्वारा उपयोग किए गए regex
https://regex101.com/r/mPEKmy/1 पर जाएं


मैं भी w / o स्पष्टीकरण से घृणा करता हूं। वैसे मुझे लगता है कि वह कह सकता है: ब्राउज़र ईमेल चेक (क्लाइंट साइड) बिल्कुल भी सुरक्षित नहीं है। कोड को बदलकर कोई भी किसी भी सर्वर पर कुछ भी भेज सकता है। तो यह स्पष्ट है और चेक (फिर से) सर्वर साइड करने का सबसे सुरक्षित तरीका है। यहाँ सवाल PHP पर आधारित है, इसलिए इसका स्पष्ट कैमरन एक सर्वर समाधान की तलाश में था न कि क्लाइंट समाधान के लिए।
जॉनी

यह उत्तर पूरी तरह से PHP से संबंधित नहीं हो सकता है, लेकिन HTML सुझाव "मानक" उपयोगकर्ता को सिर्फ एक फोन / पीसी का उपयोग करता है। साथ ही उपयोगकर्ता को साइट का उपयोग करते समय सीधे "उसके" ब्राउज़र में एक जानकारी मिलती है। सर्वर साइड पर वास्तविक चेक इस के साथ कवर नहीं हैं, निश्चित रूप से। Btw, @Thielicious ने एक PHP परिवर्तन का उल्लेख किया है, इसलिए उनकी टिप्पणी IMHO से संबंधित है।
k00ni

संभवतः यह अनुमान लगाने के कारण वोट कम हो गए कि आप "80% सुरक्षित हैं क्योंकि ब्राउज़र इंजन का अपना सत्यापनकर्ता है"। ब्राउज़र के माध्यम से http अनुरोध भेजने के कई अन्य तरीके हैं, इसलिए आप यह नहीं मान सकते कि कोई भी अनुरोध सुरक्षित है ... भले ही आप ब्राउज़र एजेंट की जाँच करें।
जबरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.