我最近问了一个关于格式化电话号码的问题,我收到了很多回复。大多数回复都很棒,但我真的很想弄清楚它的作用,因为它很有效。如果电话如下,其他线路如何工作......他们在做什么,所以我可以学习
$phone = "(407)888-9999";
$phone = preg_replace("~[^0-9]~", "", $phone);
preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
答案 0 :(得分:7)
让我们把代码分成两行。
preg_replace("~[^0-9]~", "", $phone);
首先,我们要将匹配替换为带有空字符串的正则表达式(换句话说,从字符串中删除匹配项)。正则表达式为[^0-9]
(每端的~
为delimiter)。正则表达式中的[...]
定义了character class,它告诉正则表达式引擎匹配类中的一个字符。破折号通常是字符类中的特殊字符,用于指定范围(即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);
第二行尝试将$phone
与第二个表达式匹配,如果匹配则将结果放入名为$matches
的数组中。你会注意到有三组brackets;这些定义捕获组 - 即。如果整个模式匹配,您最终会得到三个子匹配,在这种情况下,它将包含电话号码的区号,前缀和后缀。通常,正则表达式中括号中包含的任何内容都是捕获(虽然有例外,但它们超出了此解释的范围)。组也可以用于其他事情,而不需要捕获的开销,因此可以通过使用?:
(即(?:...)
)对组进行非捕获。
每个小组都做类似的事情:[0-9]{3}
或[0-9]{4}
。如上所述,[0-9]
定义了一个包含0到9之间数字的字符类(因为这里的类不以^
开头,这些不是否定组)。 {3}
或{4}
是repetition运算符,表示“匹配完全 3(或4)前一个标记(或组)”。因此[0-9]{3}
将恰好匹配一行中的三位数,[0-9]{4}
将恰好匹配一行中的四位数。请注意,数字不必完全相同(即。111
),因为每次重复都会评估字符类(因此123
将匹配,因为1匹配[0-9]
,然后2匹配[0-9]
,然后3匹配[0-9]
)。
答案 1 :(得分:6)
在preg_replace
中,它会在^
,[]
(基本上不是数字)中查找不是0-9
的任何内容,并将其替换/删除给定替换的字符串是""
。
对于第一部分,它会提取前3个数字([0-9]{3})
{3}
是匹配[]
内的项目的字符数是匹配的,因为这是在paranthesis ()
内,它将其存储为数组$matches
中的匹配项。第二部分拉出接下来的3个数字,最后一部分从$phone
中抽出最后4个数字并存储$matches
中匹配的匹配。
~
是regular expressions的分隔符。
答案 2 :(得分:1)
"[^0-9]"
表示除了0到9之间的所有数字。所以基本上,第一行用“”(无)替换除数字之外的所有内容
[0-9]{3}
表示从0到9的数字,连续3次。
因此,检查您是否有3个数字,然后是3个数字而不是4个数字,并尝试将其与$matches
匹配。
答案 3 :(得分:1)
你知道它是正则表达式标签的正则表达式。
所以,你是模式匹配。
您匹配的模式是:[^ 0-9]后跟电话号码。 [^ 0-9]不是'^'任何一个数字 所以,之后的匹配是任意3位数,后跟任意3位数,后跟任意4位数。
我不认为它会匹配,因为区域代码周围的()缺少。
我会这样做:
~\(([0-9]{3})\)([0-9]{3})-([0-9]{4})~'
答案 4 :(得分:0)
答案 5 :(得分:0)
$phone = "(407)888-9999";
$phone = preg_replace("~[^0-9]~", "", $phone);
在php中,您必须在此处使用某些非字母数字字符“〜”分隔正则表达式模式。
[^0-9]
是正则表达式模式,用于删除不在0-9范围内的$ phone中的任何内容,记住[^ ...]将取消它之前的模式。
preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
再次在这行代码中,您将“〜”作为分隔符和
([0-9]{3})
这部分模式将返回3个数字来自字符串(注意:{}用于指定要匹配的范围/字符数)在不同的输出数组维度中(使用()检查$ matches变量的结果)在模式中导致组/子匹配