1

私はこの正規表現を持っています:

/(.*)(([0-9]([^a-zA-Z])*){7,}[0-9])(.*)/.

次の値が与えられた場合

0654535263
065453-.-5263
065asd4535263

予想された結果

06**** 
06****
06****

実績

0654535263
06****
065asd4535263

文字のために最後の行と一致せず(0〜3文字で一致させたい)、最後の出現のみに一致します(例の2行目では、最初の行をスキップします)。

まず第一に、すべての回答が非常に役に立ち、私はあなたの時間を借りていることに感謝します。次のような文字列を使用できるため、数値の配列を作成してそのようにマスクすることはできません。

私はジョンです。私の電話番号は 0, 6, 5, 4, 5, 3, 5, 2, 6 - 3 -- 065asd4535263 です。

簡単にするために、入力した携帯電話番号を非表示にしたいと思います。

私は2つの問題を抱えていました:

  1. 上記の regxp を変更して、3 文字以内で区切られた数字を非表示にします。
  2. preg_replace は 1 回だけ置換していました。

最後に、任意の数の特殊文字 (12--654-5、453/--222、23....5645 など) で区切られた、少なくとも 6 桁の長さの任意の数字の配列を置き換える正規表現が必要です。または3 文字 (文字) 以下 (06asd453、123as562)。

繰り返しますが、すべての回答は非常に役に立ちますが、質問を正しく作成しなかったため、私は愚かです。

ps私はあなたに評判を与えることはできません.私は少なくとも15を持っていなければならないので、私はそれを得るとすぐに「投票」します.

4

3 に答える 3

3

うーん、文字列をマスカレードしたいだけなのに、なぜそんなに複雑なのですか。

$input = '0654535263';
$input = substr($input, 0, 2);
$output = $input . '********';

文字列の最初の 2 文字だけが必要な場合は、少し簡単です。おそらく、あなたのソリューションには別の罪がありました。しかし、これは少し簡単です。

于 2012-11-19T16:51:42.817 に答える
2

You can just use substr_replace

 echo substr_replace($v, "****", 2);

Example

$list = array("0654535263","065453-.-5263","065asd4535263");
echo "<pre>";
foreach ( $list as $v ) {
    echo substr_replace($v, "****", 2), PHP_EOL;
}

Output

06****
06****
06****
于 2012-11-19T16:57:12.977 に答える
1

正規表現を使用する理由は、取得するすべての文字列をマスクしないようにするためだと思います。この正規表現は、文字列の先頭に少なくとも 2 桁の数字があり、次に 0 ~ 3 個のアルファベット文字があり、文字列の残りのすべての文字がアルファベット以外の文字である必要があることを確認します。一致する場合は文字列をマスクし、一致しない場合は文字列が一致しないことを示します。

$string = '0654535263';
if(preg_match('~^(\d{2})\d*?[a-zA-Z]{0,3}[^a-zA-Z]*$~', $string))
  $answer = preg_replace('~^(\d{2})\d*?[a-zA-Z]{0,3}[^a-zA-Z]*$~', '$1****', $string);
else
  $answer = $string . ' does not match';
print_r($answer); // 06****
于 2012-11-19T17:07:01.323 に答える