php中的正则表达式匹配

php中的正则表达式匹配,php,regex,Php,Regex,我有一个regexp: /(.*)(([0-9]([^a-zA-Z])*){7,}[0-9])(.*)/. 给定以下值 0654535263 065453-.-5263 065asd4535263 预期结果 实际结果 由于字母的原因,它与最后一行不匹配(我想从0-3个字母中进行匹配),并且它只匹配最后一次出现(在示例中的第二行中,它跳过第一行)。 首先谢谢你所有的回答都很有用,我欠你波黑的时间。我不能创建数字数组并像那样屏蔽它们,因为我可以有这样的字符串: 我是约翰,我住在布拉布拉布拉布拉我

我有一个regexp:

/(.*)(([0-9]([^a-zA-Z])*){7,}[0-9])(.*)/.
给定以下值

0654535263
065453-.-5263
065asd4535263
预期结果 实际结果 由于字母的原因,它与最后一行不匹配(我想从0-3个字母中进行匹配),并且它只匹配最后一次出现(在示例中的第二行中,它跳过第一行)。 首先谢谢你所有的回答都很有用,我欠你波黑的时间。我不能创建数字数组并像那样屏蔽它们,因为我可以有这样的字符串:

我是约翰,我住在布拉布拉布拉布拉我的电话是:0,6,5,4,5,3,5,2,6-3-065asd4535263

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

我有两个问题:

  • 更改上面提到的regxp,以隐藏由不超过3个字符分隔的数字
  • preg_replace只替换了一次
  • 最后,我只需要用regexp替换任何数字数组,长度至少为6位,由任意数量的特殊字符(12--654-5453/--222,23…5645等)或不超过3个字符(ltters)(06asd453,123as562)分隔

    再次感谢你,所有的答案都很有帮助,但我很生气,因为我没有正确地表达我的问题


    p、 我不能给你名声,因为我必须有至少15个,一旦我得到那么多,我会“投票”,所有的答案都值得。嗯,为什么这么复杂,当你只想涂睫毛膏的时候

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

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

    嗯,当你只想涂睫毛膏的时候,为什么这么复杂呢

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

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

    您可以使用
    substr\u 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;
    }
    

    您只需使用
    substr\u 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;
    }
    

    我猜您之所以要使用正则表达式,是因为您不会屏蔽得到的每个字符串。此正则表达式检查字符串开头是否至少有2位数字,然后是0到3个字母字符,然后字符串的所有其余字符都必须是非字母字符。如果匹配,则屏蔽字符串,否则表示字符串不匹配


    我猜您之所以要使用正则表达式,是因为您不会屏蔽得到的每个字符串。此正则表达式检查字符串开头是否至少有2位数字,然后是0到3个字母字符,然后字符串的所有其余字符都必须是非字母字符。如果匹配,则屏蔽字符串,否则表示字符串不匹配


    我真的不明白你想要实现什么。你的正则表达式与“我想匹配0到3个字母”几乎没有任何关系。您能否提供更多的输入示例(尤其是那些应该失败的示例),并更详细地说明匹配的条件是什么?
    preg_replace('/([0-9]{2})\S+[0-9]/m','$1****',$string)
    将实现您在这个问题中要求的结果,但正如@m.buettner所说的,因为我们不知道它应该在什么时候失败,它几乎肯定会匹配误报。我真的不明白您想要实现什么。你的正则表达式与“我想匹配0到3个字母”几乎没有任何关系。您能提供更多的输入示例(尤其是那些应该失败的示例),并详细说明匹配的条件是什么?
    preg\u replace('/([0-9]{2})\S+[0-9]/m','1****',$string)
    将实现您在这个问题中要求的结果,但正如@m.buettner所说的,因为我们不知道什么时候应该失败,它几乎肯定会匹配误报。
    $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****