替换字符串中出现的所有子字符串,并保留前2-PHP

替换字符串中出现的所有子字符串,并保留前2-PHP,php,regex,preg-replace,Php,Regex,Preg Replace,我想用一个空字符串替换所有电子邮件地址,只留下前两个。 所以$newString应该是 我正在给john@gmail.com及hoe@gmail.com但是。但这是徒劳的 我该如何做…作为一般答案: 与PREG\u SPLIT\u DELIM\u CAPTURE一起使用 在结果数组中,从[4]之后开始删除索引不均匀的每个数组项 然后使用将余数连接起来 您可以尝试使用爆炸 $regex = '([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})'; $string =

我想用一个空字符串替换所有电子邮件地址,只留下前两个。 所以$newString应该是
我正在给john@gmail.com及hoe@gmail.com但是
。但这是徒劳的

我该如何做…

作为一般答案:

  • PREG\u SPLIT\u DELIM\u CAPTURE一起使用

  • 在结果数组中,从
    [4]
    之后开始删除索引不均匀的每个数组项

  • 然后使用将余数连接起来


您可以尝试使用爆炸

$regex = '([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})';
$string = 'I am emailing to john@gmail.com and hoe@gmail.com but harris@live.com';

$newString = preg_replace($regex,'',$string);
$str=我正在给john@gmail.com及hoe@gmail.com但是harris@live.com; 
$str_数组=分解(,$str);
$counter=0;
$str_out=;
foreach($str_数组作为$cast){
$findme=@;
$pos=strpos($cast,$findme);
如果($pos==false){
$str_out=$str_out.$cast;
}否则{
$counter++;

如果你最近没有问过几乎相同的问题吗?你的正则表达式是否能正确识别所有电子邮件地址?使用preg_replace_callback并跟踪替换的数量。这太复杂了,而且会删除任何包含@的不仅仅是电子邮件地址的“单词”。
 $str = I am emailing to john@gmail.com and hoe@gmail.com but harris@live.com; 
 $str_array = explode( , $str); 
 $counter = 0; 
 $str_out = ; 
 foreach($str_array as $cast){ 
    $findme   = @; 
    $pos = strpos($cast, $findme); 
    if ($pos === false) { 
        $str_out = $str_out . $cast .  ; 
    }else{ 
        $counter++; 
        if($counter<=2){ 
            $str_out = $str_out . $cast .  ; 
        } 
    } 
 } 
 echo $str_out;