0

私が達成しようとしていることはかなり単純です。次のような入力が必要です

漢aelena@tratata.com

することが:

漢******@tratata.com

そこで、最初の文字と「@」の間で一致するようにこの正規表現を作成しました。

mb_regex_encoding ('UTF-8' );
mb_ereg_replace('(?<=^.{1}).*?(?=@)','*','漢aelena@tratata.com',1);

ただし、問題は、1 回しか一致しないため、6 つではなく 1 つの星しか付けられないことです。このようなものは、私が得るものです:

漢*@tratata.com

次に、mb_ereg_replace_callback を使用して、次を返したいと思いました。

return $matches[1].str_repeat('*', strlen($matches[1]));

それから仕様を読んだところ、mb_ereg_replace_callback は PHP 5.4.1 以降で利用可能であると書かれていました。

...どうすれば同じことを達成できますか?

4

5 に答える 5

3

コールバック関数を使用する必要はありません。単一の正規表現で実行できます。

(?<=.).(?=.*@)
  • (?<=.)、最初の文字を置き換えないように、前に少なくとも 1 文字があることを確認してください。
  • .、任意の文字に一致します。
  • (?=.*@)@、文字の後にあることを確認してください。

関数がpreg_replaceunicode 修飾子で変更された例 (推奨):

echo preg_replace('/(?<=.).(?=.*@)/u','*','漢aelena@tratata.com');

出力:

漢******@tratata.com
于 2012-07-29T11:18:00.043 に答える
1

代替コールバックはオプションです。

echo preg_replace_callback('/(?<=^.).+(?=@)/u', function($match) {
    return str_pad('', strlen($match[0]), '*');
}, "something@something.com");
//s*******@something.com

コールバックとして無名関数を使用していることに注意してください。これは PHP >= 5.3 のみです。5.3 未満の場合は、名前付き関数または で作成された関数を使用してfunction_create()ください。

于 2012-07-29T11:01:25.557 に答える
1

PCRE ファミリーpreg_replace_callback()の関数を使用できます。修飾子を使用してUTF-8 をサポートできます。u

PCRE ( ) と POSIX ( ) の方法にはいくつかの小さな違いがあることに注意してください。後者は非推奨です。preg_ereg_

于 2012-07-29T10:50:13.430 に答える
1
<?php

$email = '漢aelena@tratata.com';

    $email = preg_replace_callback('#^(.){1}(.*?)@#u', function($matches)
            {
                return $matches[1] . str_repeat('*', mb_strlen($matches[2])) . '@';
            },
    $email);

echo $email; # 漢******@tratata.com
于 2012-07-29T10:53:33.750 に答える
-1

これがはるかに高速に実行できるのに、なぜ正規表現を使用するのですか?

if(($pos = mb_strpos($email,'@')) > 0) {
    for($i=1;$i<=$pos;$i++) {
        $email[$i] = '*';
    }
}
于 2012-07-29T10:52:50.957 に答える