我最近问了一个关于格式化电话号码的问题,我收到了很多回复.大多数回复都很棒,但我真的很想弄清楚它的作用,因为它很有效.如果电话如下,其他线路如何工作...他们在做什么,所以我可以学习
$phone = "(407)888-9999";
$phone = preg_replace("~[^0-9]~", "", $phone);
preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
Run Code Online (Sandbox Code Playgroud)
让我们把代码分成两行.
preg_replace("~[^0-9]~", "", $phone);
Run Code Online (Sandbox Code Playgroud)
首先,我们将用空字符串替换匹配到正则表达式(换句话说,从字符串中删除匹配).正则表达式[^0-9](~每一端都是一个分隔符).[...]在正则表达式中定义一个字符类,它告诉正则表达式引擎匹配类中的一个字符.破折号通常是字符类中的特殊字符,用于指定范围(即0-9表示所有字符在0和之间9).
你可以把一个角色类想象成一个大OR条件的速记:即.[0-9]是一个简写1 or 2 or 3 or 4 or 5 or 6 or 7 or 8 or 9.请注意,类不必包含范围 - [aeiou]是匹配a or e or i or o or u(或换句话说,任何元音)的字符类.
当类中的第一个字符为时,^该类被否定,这意味着正则表达式引擎应该匹配类中没有的任何字符.因此,当您将所有这些放在一起时,第一行将删除任何不是数字(0和之间的字符9)的内容$phone.
preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
Run Code Online (Sandbox Code Playgroud)
第二行尝试匹配$phone第二个表达式,并将结果放入一个名为$matches(如果匹配)的数组中.你会注意到有三组括号 ; 这些定义捕获组 - 即.如果有一个模式作为一个整体的比赛,你最终将有三个子匹配,在这种情况下将包含电话号码的区号,前缀和后缀.通常,正则表达式中括号中包含的任何内容都是捕获(虽然有例外,但它们超出了此解释的范围).组也可以用于其他事情,而不需要捕获的开销,因此可以通过使用(即)来对组进行非捕获.?:(?:...)
每个小组都做类似的事情:[0-9]{3}或[0-9]{4}.如上所述,[0-9]定义一个包含0到9之间数字的字符类(因为这里的类不是从这里开始的^,所以这些不是否定组).的{3}或{4}是一个重复运算符,它表示"相匹配恰好 3(或4)以前的令牌(或基团)的".因此,[0-9]{3}将连续匹配三位数,并且[0-9]{4}将连续匹配四位数.请注意,数字不必完全相同(即.111),因为每次重复123都会评估字符类(因此匹配,因为1匹配[0-9],然后2匹配[0-9],然后3匹配[0-9]).
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |