4

誰かがこの冗長なコードを単純化するのを手伝ってくれませんか?

if (isset($to) === true)
{
    if (is_string($to) === true)
    {
        $to = explode(',', $to);
    }

    $to = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $to), FILTER_VALIDATE_EMAIL));
}

if (isset($cc) === true)
{
    if (is_string($cc) === true)
    {
        $cc = explode(',', $cc);
    }

    $cc = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $cc), FILTER_VALIDATE_EMAIL));
}

if (isset($bcc) === true)
{
    if (is_string($bcc) === true)
    {
        $bcc = explode(',', $bcc);
    }

    $bcc = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $bcc), FILTER_VALIDATE_EMAIL));
}

if (isset($from) === true)
{
    if (is_string($from) === true)
    {
        $from = explode(',', $from);
    }

    $from = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $from), FILTER_VALIDATE_EMAIL));
}

変数変数を使ってみましたが、うまくいきませんでした(使ってから久しぶりです)。

4

7 に答える 7

4

可変変数:

$vars = array('to', 'cc', 'bcc', 'from');
foreach ($vars as $varname) {
    if (isset($$varname)) {
        if (is_string($$varname)) {
            $$varname = explode(',', $$varname);
        }
        $$varname = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $$varname), FILTER_VALIDATE_EMAIL));
    }
}

通常 (可変変数を使用しない場合):

$vars = compact('to', 'cc', 'bcc', 'from'); 
foreach ($vars as $name => &$var) {
    if (is_string($var)) {
        $var = explode(',', $var);
    }
    $var = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $var), FILTER_VALIDATE_EMAIL));
}
extract ($vars);

コンパクトは設定されている変数のみをインポートするため、 isset は必要ありません。他のすべては無視されます...

ところで: === true は必要ありません。isset() または is_string() は常にブール値を返します。したがって、 === true は冗長です...

于 2010-05-21T13:07:41.850 に答える
2

あなたはできる(未テスト)

$vars = array($from, $to, $cc, $bcc);

foreach ($vars as $var)
        {
        $var = explode(',', $var);
        ....
        ...
        }

$from = $vars[0];
$to = $vars[1];
$cc = $vars[2];
$bcc = $vars[3];
于 2010-05-21T13:00:32.023 に答える
2

関数に入れますか?

function validate($str) {
    if (isset($str) === true)
    {
        if (is_string($str) === true)
        {
            $str = explode(',', $str);
        }

        $str = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $str), FILTER_VALIDATE_EMAIL));
    }
    return $str;
}

$to = validate($to);
$cc = validate($cc);
$bcc = validate($bcc);
$from = validate($from);
于 2010-05-21T13:01:47.433 に答える
1

値を配列に貼り付けて、それを反復処理するだけです。

function cleanEmails($value) {
    if (is_string($value)) {
        $value = explode(',', $value);
    }
    return array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $value), FILTER_VALIDATE_EMAIL));
}

$fields = array();
if (isset($to)) {
    $fields['to'] = $to;
}
if (isset($from)) {
    $fields['from'] = $from;
}
if (isset($cc)) {
    $fields['cc'] = $cc;
}
if (isset($bcc)) {
    $fields['bcc'] = $bcc;
}
$result = array_map('cleanEmails', $fields);

最終結果は 2 次元配列になり、最初のインデックスは設定されたフィールドになり、2 番目のインデックスはそれぞれのメール アドレスになります...

于 2010-05-21T13:02:56.197 に答える
1

完全な変数変数ルートに行かなくても、チェックを共通の関数に入れて、次のようにするだけで、これを大幅に簡素化できます。

$to = cleanup_email_addrs($to);
$cc = cleanup_email_addrs($cc);
$bcc = cleanup_email_addrs($bcc);
$from = cleanup_email_addrs($from);
于 2010-05-21T13:03:09.537 に答える
1

私はこれを行うことができます:

おそらくそのための関数を作成できます:

function checkIt($var)
{
    if (isset($var) === true)
    {
        if (is_string($var) === true)
        {
          $var = explode(',', $var);
        }

        $to = explode(',', $var);
        $to = array_filter(filter_var_array(preg_replace('~[<>]|%0[ab]|[[:cntrl:]]~i', '', $to), FILTER_VALIDATE_EMAIL));
    }

    return $to;
}

これで、変数をこの関数に渡すことができます。

于 2010-05-21T13:00:15.603 に答える
1

isset() === trueまず、 ;を取り除くことができます。またはをisset()返します。truefalse

もちろん、すべてのifステートメントが同じことをしているように見えるので、それを関数に入れますが、それは前に述べた...

ところで、array_filter入力が ではない場合、あなたの行は機能しますarray()か?

そうでない場合は、そのステートメントをステートメント内に含める必要がありますif (is_string())

于 2010-05-21T13:04:41.860 に答える