有人可以向我解释这个正则表达式吗?

时间:2010-09-21 14:53:15

标签: 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);

6 个答案:

答案 0 :(得分:7)

让我们把代码分成两行。

preg_replace("~[^0-9]~", "", $phone);

首先,我们要将匹配替换为带有空字符串的正则表达式(换句话说,从字符串中删除匹配项)。正则表达式为[^0-9](每端的~delimiter)。正则表达式中的[...]定义了character class,它告诉正则表达式引擎匹配类中的一个字符。破折号通常是字符类中的特殊字符,用于指定范围(即0-9表示09之间的所有字符(包括)

您可以将字符类视为大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)

检查此错误

在PHP中使用正则表达式

答案 5 :(得分:0)

$phone = "(407)888-9999";
$phone = preg_replace("~[^0-9]~", "", $phone);
  1. 在php中,您必须在此处使用某些非字母数字字符“〜”分隔正则表达式模式。

  2. [^0-9]是正则表达式模式,用于删除不在0-9范围内的$ phone中的任何内容,记住[^ ...]将取消它之前的模式。

    preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);

  3. 再次在这行代码中,您将“〜”作为分隔符和 ([0-9]{3})这部分模式将返回3个数字来自字符串(注意:{}用于指定要匹配的范围/字符数)在不同的输出数组维度中(使用()检查$ matches变量的结果)在模式中导致组/子匹配