0

ユーザーが入力したメールアドレスが特定のドメインのものである場合にのみアクションを実行するスクリプトを作成しようとしています。正規表現ユーティリティを使用してテストすると機能するように見える正規表現を作成しましたが、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';
}

何がパターンに夢中になっているのかよくわかりません。どんな助けでもいただければ幸いです。

4

4 に答える 4

1

正規表現で大文字と小文字を区別しないようにするには、おそらく使用する必要があります/\b[A-Z0-9\._%+-]+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i(最後にあることに注意してください)。また、この場合は意味をなさない無限の繰り返しを可能にするためi、sを削除しました。+

于 2009-11-30T20:49:05.907 に答える
1

正規表現は少しずれており(foo@secondgearsoftwaresecondgearsoftware.comが許可されます)、簡略化できます。

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

大文字と小文字を区別せず、文字列の最後に固定しました。

「@」の前にあるものを確認する必要はないようです。必要に応じて適切な検証ルーチンを用意する必要がありますが、メールアドレスがこれらのドメインのいずれかに属しているかどうかを確認したいだけのようです。

于 2009-11-30T20:56:35.623 に答える
1

正規表現を使用したメンテナンスが簡単なソリューションは次のとおりです

$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
于 2009-11-30T21:53:11.433 に答える
-1

正規表現を削除し、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」を挿入するだけです。このコードも少し長くなりますが、正規表現を気にせずに新しいドメインで簡単に拡張できます。

于 2009-11-30T21:16:33.927 に答える