تنفيذ البرنامج النصي إلا إذا دخلت البريد الإلكتروني من مجال معين

StackOverflow https://stackoverflow.com/questions/1822280

  •  10-07-2019
  •  | 
  •  

سؤال

واني اسعى الى خلق السيناريو الذي سيتم تنفيذ عملياتها إلا إذا كان عنوان البريد الإلكتروني يدخل المستخدم هو من مجال معين. أنا خلقت التعابير المنطقية التي يبدو أنها تعمل عند اختباره عبر أداة التعبير العادي، ولكن عند استخدامها في بلدي النصي PHP، يقول لي أن رسائل البريد الإلكتروني صالحة غير صالحة. في هذه الحالة، أريد لأي بريد إلكتروني غير من @ secondgearsoftware.com، @ secondgearllc.com أو asia.secondgearsoftware.com أن أردد النجاح وجميع الآخرين في رفض.

$pattern = '/\b[A-Z0-9\._%+-]+@((secondgearsoftware|secondgearllc|euro\.secondgearsoftware|asia\.secondgearsoftware)+\.)+com/';
$email = urldecode($_POST['email']);
if (preg_match($pattern, $email))
{
    echo 'success';
}
else
{
    echo 'opposite success';
}

وأنا لست متأكدا ما futzed مع النمط. أي مساعدة سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

وأقترح عليك إسقاط التعابير المنطقية وببساطة استخدام stristr لمعرفة ما اذا كان مباريات. شيء من هذا القبيل يجب أن تعمل:

<?php
// Fill out as needed
$domains = array('secondgearsoftware.com', 'secondgearllc.com');

$email = urldecode($_POST['email']);
$found = false;
for(i=0;i<count($domains);i++)
{
    if ($domains[i] == stristr($email, $domains[i]))
        $found = true;
}

if ($found) ...
?>

وظيفة stristr إرجاع عنوان البريد الإلكتروني من الجزء حيث وجد مباراة حتى النهاية، الذي يجب أن يكون نفس المباراة في هذه الحالة. من الناحية الفنية يمكن أن يكون هناك شيء قبل المجالات (fkdskjfsdksfks.secondgeartsoftware.com)، ولكن يمكنك فقط إدراج "@ domainneeded.com" لمنع ذلك. هذا الرمز هو أيضا أطول قليلا، ولكن تمتد بسهولة مع مجالات جديدة دون الحاجة إلى القلق حول التعابير المنطقية.

نصائح أخرى

والتعبير العادي الخاص بك هو قليلا قبالة (انها ستسمح foo@secondgearsoftwaresecondgearsoftware.com) ويمكن تبسيط:

$pattern = '/@((euro\.|asia\.)?secondgearsoftware|secondgearllc)\.com$/i';

ولقد أعلنت حالة الأحرف، وترتكز إلى نهاية السلسلة.

وهناك لا يبدو أن هناك حاجة لفحص ما قبل "@" - يجب أن يكون التحقق من صحة روتين المناسب لأنه إذا لزم الأمر، ولكن يبدو كنت ترغب فقط في معرفة ما اذا كان عنوان البريد الإلكتروني ينتمي إلى واحدة من هذه المجالات.

وربما كنت بحاجة إلى استخدام /\b[A-Z0-9\._%+-]+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (لاحظ i في النهاية) وذلك لجعل التعبير المعتاد حالة الأحرف. كما أنني أسقطت +s لأنها تسمح للتكرار لا نهائي الذي لا معنى له في هذه القضية.

إليك وسيلة سهلة للحفاظ على الحل باستخدام التعابير العادية

$domains = array(
    'secondgearsoftware',
    'secondgearllc',
    'euro\.secondgearsoftware',
    'asia\.secondgearsoftware'
);
preg_match("`@(" .implode("|", $domains). ")\.com$`i", $userProvidedEmail);

وهنا زوجين من الاختبارات:

$tests = array(
    'bob@secondgearsoftware.com',
    'bob@secondgearllc.com',
    'bob@Xsecondgearllc.com',
    'bob@secondgearllc.net',
    'bob@euro.secondgearsoftware.org',
    'bob@euro.secondgearsoftware.com',
    'bob@euroxsecondgearsoftware.com',
    'bob@asia.secondgearsoftware.com'
);

foreach ( $tests as $test ) { 
    echo preg_match("`@(" .implode("|", $domains). ")\.com$`i", $test), 
         " <- $test\n";
}

والنتيجة (1 يمر طبعا)

1 <- bob@secondgearsoftware.com
1 <- bob@secondgearllc.com
0 <- bob@Xsecondgearllc.com
0 <- bob@secondgearllc.net
0 <- bob@euro.secondgearsoftware.org
1 <- bob@euro.secondgearsoftware.com
0 <- bob@euroxsecondgearsoftware.com
1 <- bob@asia.secondgearsoftware.com
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top