php中的正则表达式匹配

时间:2012-11-19 16:47:26

标签: php regex

我有这个正则表达式:

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

给出以下值

0654535263
065453-.-5263
065asd4535263

预期结果

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

实际结果

0654535263
06****
065asd4535263

由于字母(我希望匹配0-3个字母)而与最后一行不匹配,并且它仅匹配最后一次出现(在示例的第二行中,它跳过第一行)。

首先,谢谢你所有的oyur答案非常有帮助,我欠你一个时间。我不能创建数字数组并像这样掩盖它们因为我可以有这样的字符串:

我是约翰,我活着,我的手机是:0,6,5,4,5,3,5,2,6 - 3 - 065asd4535263。

为了简化,我想隐藏输入的手机号码。

我有两个问题:

  1. 更改上面提到的regxp,隐藏不超过3个字符的数字。
  2. preg_replace只替换了一次出现。
  3. 最后我只需要regexp来替换任意数字,至少6位数字,由任意数量的特殊字符分隔(12--654-5,453 / - 222,23 .... 5645等)或不超过3个字符(ltters)(06asd453,123as562)。

    再次感谢你,所有答案都非常有帮助,但我是老师,因为我没有正确地提出我的问题。

    P.S。我不能给你声名,因为我必须至少有15个,一旦我得到那么多,我就会“投票”,所有答案都值得。

3 个答案:

答案 0 :(得分:3)

嗯,为什么如此复杂,只想要对你的字符串进行捣乱。

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

当你只需要字符串的前2个字符时,它会更容易一些。也许你的解决方案还有另一个罪但这有点容易。

答案 1 :(得分:2)

您可以使用substr_replace

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

示例

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

输出

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

答案 2 :(得分: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****