5

重複の可能性:
正規表現でメールを部分的に非表示にしますか?

私は現在、メールアドレスを非表示にするスクリプトを書いています(したがって、test@domain.comはt~~~@ ~~~~~~ .comになります)。

この質問の指示に従いながら、正規表現で電子メールを部分的に非表示にしますか?-t ~~~@domain.comを表示することができましたが、「ドメイン」の削除に問題があります。

これが私がこれまでに持っているものです($ row-> emailが"test@domain.com"であると仮定します):-

$string = preg_replace("(?<=.).(?=.*@)","~", $row->email);
$string = preg_replace("(?<=@).[a-zA-Z0-9]*","~", $string);

ただし、返されるのはt ~~~ @〜omain.comだけです。

ドメインビットの残りを取得する方法について困惑しています。アイデア?

理想的には、誰かが解決策を提供して、それがt ~~~ @ d ~~~~~~ .comになるとしたら、それは素晴らしいことです。

乾杯

4

2 に答える 2

5

です。

  • マッチング(およびスキップ)"@"してから;
  • マッチング.(任意の文字:つまり、"d"in "domain")そして;
  • 次の文字クラスの0(ゼロ)に一致します。これは、指定された正規表現に一致するために必要な最小値です。

つまり、が一致して。に置き換えられた後の最初で唯一の最初の文字です。@~

以下

(?<=@.)[a-zA-Z0-9-]*(?=(?:[.]|$))

"."文字クラスを最初の(ピリオドのように".com")または入力の終わりに強制的に一致させます。

は-look-behind句.に移動されるため、。の後の最初の文字がスキップされることに注意してください。また、ドメイン名で有効な(そしてひどく珍しいことではない)ので、文字クラスにハイフン()を追加しました。(?<=@.)"@""-"

さらに、すべての電子メールアドレスが簡単な"a@b.c"形式であるとは限らず、国際化ドメイン名(またはIDN)は、送信されない場合(たとえば、制限されたコンテキストで使用されない場合)、非 punycode形式でローカルに表すことができますが、それは別のトピックです。( IDNにより、詳細な指定なしに置き換える方が適切な場合があります。)[a-zA-Z0-9-]*[^.]*

于 2012-09-03T20:43:52.880 に答える
0

このようにすることもできますが、何もないとしても、少なくとも読みやすく、変更するのは非常に簡単です。

$email = $row->email;
$atPos = strpos( $email, "@" );
preg_match('/(\..*?)$/', $email, $topDomain, PREG_OFFSET_CAPTURE);
$emailLength = strlen($email);

$hiddenEmail = $email[0] . 
               str_repeat('~', $atPos-1) . 
               "@" . 
               $email[$atPos + 1] . 
               str_repeat('~', $topDomain[1][1]-$atPos-2) . 
               $topDomain[1][0];
于 2012-09-03T21:15:01.773 に答える