PHP RexExp匹配并替换

时间:2015-10-07 08:41:46

标签: php regex

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

匹配字符串的RexEx是:

/^[0-9]{1,3}[0-9]{6,7}$/

匹配我所在国家/地区的本地手机号码:

0921234567

但是我想以这种方式替换数字:添加“+”符号,添加我的国家代码“123”,添加“。”签名,然后最后添加匹配的数字和剥离的前导零。

最终号码将是:

385.921234567

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

\+$&\n\t

我将使用PHP preg_replace函数。

编辑:

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

可能的数字是:

0921234567 00111921234567

其中111是国家代码。我知道有些国家/地区代码包含2位或3位数字,但我会针对大多数国家/地区代码创建特殊情况。

3 个答案:

答案 0 :(得分:2)

^[0-9]([0-9]{1,2}[0-9]{6,7})$

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

https://regex101.com/r/cJ6zQ3/22

$re = "/^[0-9]([0-9]{1,2}[0-9]{6,7})$/m"; 
$str = "0921234567\n"; 
$subst = "+385.$1"; 

$result = preg_replace($re, $subst, $str);

答案 1 :(得分:2)

您可以使用此preg_replace从您的手机#:

开始删除可选的零
$str = preg_replace('~^0*(\d{7,9})$~', '+385.$1', $str);

答案 2 :(得分:1)

我会使用两步解决方案:

  1. 检查我们是否匹配主正则表达式
  2. 将此号码替换为待处理的+ + country code + . + number without leading zeros
  3. PHP code

    $re = "/^[0-9]{7,10}$/"; 
    $str = "0921234567"; 
    if (preg_match($re, $str, $match)) {
        echo "+385." . preg_replace('/^0+/', '', $match[0]);
    }
    

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

    使用/^0+/正则表达式从一开始就可以轻松修剪前导零。