如何用特殊字符替换不匹配的单词?

时间:2015-10-02 09:25:08

标签: php regex preg-replace

我想用javascript:(function(){ var e=document.getElementById('text'); if(e){e.value%20+='Input your Query';} document.getElementById(Email-textarea'); if(f) {f.value%20+=%20'@gmail.com';} })(); 替换相同数量的不匹配字符。就像我的字符串

一样
*

应该替换为

xyzdsdasdas@xyss.com

现在只是为了解决我使用以下正则表达式

x*********s@x**s.com

因此使用跟随正则表达式和^(\w).*?(.@.).*?(.\.\w+) 一样的

preg_replace

导致

echo preg_replace('/^(\w).*?(.@).*?(\.\w+)/', "$1****$2****$3", "xyzdsdasdas@xyss.com");

但我想在这里实现的是

x****s@x****s.com

Demo

4 个答案:

答案 0 :(得分:3)

我会使用(*SKIP)(*F)

preg_replace('~(?:^.|.@.|.\.\w+$)(*SKIP)(*F)|.~', '*', $str);

DEMO

  • 首先匹配你不想要的所有字符。即,(?:^.|.@.|.\.\w+$)
  • 现在,使用(*SKIP)(*F)
  • 跳过这些匹配
  • |
  • 现在|之后的点将匹配跳过的所有字符。

答案 1 :(得分:0)

不使用preg_replace,只是为了给你一个想法,我的代码没有优化! (我知道)

$str = 'xyzdsdasdas@xyss.com';
$buff = explode('@', $str);
$buff2 = explode('.', $buff[1]);

$part1 = $buff[0][0] . str_repeat('*', strlen($buff[0]) - 2) . $buff[0][strlen($buff[0]) - 1];
$part2 = $buff[1][0] . str_repeat('*', strlen($buff2[0]) - 2) . $buff2[0][strlen($buff2[0]) - 1];

echo $part1 .'@'. $part2 .'.'. $buff2[1];

但它有效。

答案 2 :(得分:0)

您也可以使用preg_replace_callback功能

function callbackFunction($m) {
  return $m[1].(str_repeat('*', strlen($m[2]))).$m[3].(str_repeat('*', strlen($m[4]))).$m[5];
}

$pattern = '|^(\\w)(.*?)(.@.)(.*?)(.\\.\\w+)|';
$subject = 'xyzdsdasdas@xyss.com';
print_r( preg_replace_callback($pattern, 'callbackFunction', $subject, -1 ) );

答案 3 :(得分:0)

另一次尝试,没有explode

<?php

$email="blablabla@truc.com" ;

$arobase_pos = strpos($email,"@"); // first occurence of "@"
$dot_pos = strrpos($email,".");    // last occurence of ".""

// from 2 to post(@) -1
$email = substr_replace($email, str_repeat ("*", $arobase_pos - 2), 1, $arobase_pos - 2);
// from pos(@)+2 to pos(.)-1 
$email = substr_replace($email, str_repeat ("*", $dot_pos-1-$arobase_pos-2),  $arobase_pos + 2, $dot_pos-1-$arobase_pos-2);

// Display
echo $email;
?>