PHP RexExp匹配和替换

PHP RexExp匹配和替换,php,regex,Php,Regex,我正在使用在线regexr.com工具测试RegExp。我将用多个用例测试字符串,但我无法让替换工作 匹配字符串的RexEx为: /^[0-9]{1,3}[0-9]{6,7}$/ 它与我所在国家的本地手机号码匹配,如下所示: 0921234567 但我想用这种方式替换数字:加上“+”号,加上我的国家代码“123”,加上“.”号,最后,加上匹配的数字,前面加上零 最终人数为: +385.921234567 我有插入匹配字符串的基本想法,但我不确定如何在字符前加前缀,并在以下替换模式中从匹配字符串

我正在使用在线regexr.com工具测试RegExp。我将用多个用例测试字符串,但我无法让替换工作

匹配字符串的RexEx为:

/^[0-9]{1,3}[0-9]{6,7}$/
它与我所在国家的本地手机号码匹配,如下所示:

0921234567

但我想用这种方式替换数字:加上“+”号,加上我的国家代码“123”,加上“.”号,最后,加上匹配的数字,前面加上零

最终人数为:

+385.921234567

我有插入匹配字符串的基本想法,但我不确定如何在字符前加前缀,并在以下替换模式中从匹配字符串中去掉零:

\+$&\n\t
我将使用PHP preg_replace函数

编辑:

正如有人明智地提到的,可能会有一个、两个或没有零,但我将使用regex创建单独的测试用例,只测试零的数量。在一个正则表达式中这样做现在似乎很复杂

可能的数字如下:

0921234567 00111921234567

其中111是国家代码。我知道有些国家/地区代码由2或3位数字组成,但我将为大多数国家/地区代码创建特殊情况

^[0-9]([0-9]{1,2}[0-9]{6,7})$
您只需添加
。替换为
+385.$1
。请参阅演示

您只需添加
。替换为
+385.$1
。请参阅演示


您可以使用此
preg_replace
从手机的开头去除可选的零:


您可以使用此
preg_replace
从手机的开头去除可选的零:


我将使用两步解决方案:

  • 检查我们是否匹配主正则表达式
  • 用不带前导零的预挂起的
    +
    +
    国家代码
    +
    +
    编号替换该编号
  • :

    请注意,在不使用捕获组的情况下,在正则表达式模式中拆分字符类是没有意义的
    ^[0-9]{7,10}$
    ^[0-9]{1,3}[0-9]{6,7}$
    相同,意思是从字符串的开始到结束匹配7到10位数字


    使用
    /^0+/
    regex可以很容易地从一开始就修剪前导零。

    我将使用两步解决方案:

  • 检查我们是否匹配主正则表达式
  • 用不带前导零的预挂起的
    +
    +
    国家代码
    +
    +
    编号替换该编号
  • :

    请注意,在不使用捕获组的情况下,在正则表达式模式中拆分字符类是没有意义的
    ^[0-9]{7,10}$
    ^[0-9]{1,3}[0-9]{6,7}$
    相同,意思是从字符串的开始到结束匹配7到10位数字



    使用
    /^0+/
    regex可以很容易地从一开始就修剪前导零。

    如果开头有多个零呢?或者根本没有零?如果输入为
    0021234567
    ,则输出为
    +385.021234567
    。零仍然存在。我不确定这是否是预期的。@stribizhev那么OP的正则表达式将不匹配。为什么要在正则表达式的开头使用
    [0-9]
    而不是
    0
    ?如果第一个数字不是零,如果正则表达式不匹配,可能会更好。如果开头有多个零呢?或者根本没有零?如果输入为
    0021234567
    ,则输出为
    +385.021234567
    。零仍然存在。我不确定这是否是预期的。@stribizhev那么OP的正则表达式将不匹配。为什么要在正则表达式的开头使用
    [0-9]
    而不是
    0
    ?如果正则表达式不匹配,如果第一个数字不是零,可能会更好。
    00111921234567
    的预期输出是什么?好的,我看到你接受了答案,尽管我会使用@vks,问得好。我必须去掉开头的所有零。@AlanKis所以
    00111921234567
    应该变成
    +385111921234567
    ??//@AlanKis你可以去掉最后的范围限制并使用:
    $str=preg\u replace(“~^0*(\d{7,})$~,“+385.$1,$str)
    00111921234567
    的预期输出是什么好的,我看到你接受了答案,尽管我会使用@vks,这是个好问题。我必须去掉开头的所有零。@AlanKis所以
    00111921234567
    应该变成
    +385111921234567
    ??//@AlanKis你可以去掉最后的范围限制并使用:
    $str=preg\u replace(“~^0*(\d{7,})$~,“+385.$1,$str)。这个答案最符合我的问题。有可能会有一个、两个或零都没有。阿努巴瓦,仍在踢屁股,你应该得到一件t恤衫。在模式中tilde是什么意思?PHP允许任何字符用作正则表达式分隔符
    /
    ~
    #
    被广泛用作分隔符。这个答案最适合我的问题。有可能会有一个、两个或零都没有。阿努巴瓦,仍在踢屁股,你应该得到一件t恤衫。在模式中tilde是什么意思?PHP允许任何字符用作正则表达式分隔符
    /
    ~
    #
    被广泛用作分隔符。
    $re = "/^[0-9]([0-9]{1,2}[0-9]{6,7})$/m"; 
    $str = "0921234567\n"; 
    $subst = "+385.$1"; 
    
    $result = preg_replace($re, $subst, $str);
    
    $str = preg_replace('~^0*(\d{7,9})$~', '+385.$1', $str);
    
    $re = "/^[0-9]{7,10}$/"; 
    $str = "0921234567"; 
    if (preg_match($re, $str, $match)) {
        echo "+385." . preg_replace('/^0+/', '', $match[0]);
    }