有人可以向我解释这个注册表吗?

Mat*_*iby 1 php regex

我最近问了一个关于格式化电话号码的问题,我收到了很多回复.大多数回复都很棒,但我真的很想弄清楚它的作用,因为它很有效.如果电话如下,其他线路如何工作...他们在做什么,所以我可以学习

$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)

Dan*_*uis 7

让我们把代码分成两行.

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]).


Jim*_* W. 6

preg_replace它查找任何不是,^内侧[],0-9(基本上非数字),并替换/从给出的更换是字符串中删除"".

对于第一部分,它会拉出前3个数字([0-9]{3}),{3}即匹配内部项目的字符数是[]匹配的,因为这是在paranthesis里面,()它将它存储为数组中的匹配项$matches.第二部分拉出接下来的3个数字,最后一部分拉出最后4个数字$phone并存储匹配的匹配$matches.

~是对定界符正则表达式.