我正在使用在线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位数字,但我会针对大多数国家/地区代码创建特殊情况。
答案 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)
我会使用两步解决方案:
+
+ country code
+ .
+ number without leading zeros
。$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+/
正则表达式从一开始就可以轻松修剪前导零。