Php 有人能给我解释一下吗?

Php 有人能给我解释一下吗?,php,regex,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); 在preg\u replace

我最近问了一个关于电话号码格式的问题,得到了很多回答。大多数回答都很好,但有一个我真的很想弄清楚它在做什么,因为它很有效。如果电话如下,其他线路是如何工作的…它们在做什么,以便我可以学习

$phone = "(407)888-9999";

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

preg\u replace
中,它查找
[]
内部的
^
0-9
(基本上不是数字)并从该字符串中替换/删除它,前提是替换为
“”

对于第一部分,它提取出前3个数字
([0-9]{3})
{3}
是要匹配的字符数,
[]
中的项目是要匹配的,因为这是在
()
中,它将其作为匹配项存储在数组
$matches
中。第二部分从
$phone
中提取接下来的3个号码,最后一部分从
$matches
中提取最后4个号码,并存储在
$matches
中匹配的号码


~
是车辆的仪表

preg\u replace
中,它查找
[]
内部的
^
0-9
(基本上不是一个数字),并从该字符串中替换/删除它,前提是替换为

对于第一部分,它提取出前3个数字
([0-9]{3})
{3}
是要匹配的字符数,
[]
中的项目是要匹配的,因为这是在
()
中,它将其作为匹配项存储在数组
$matches
中。第二部分从
$phone
中提取接下来的3个号码,最后一部分从
$matches
中提取最后4个号码,并存储在
$matches
中匹配的号码


~
是车辆的仪表

检查一下这个tuts

在PHP中使用正则表达式


检查此tuts

在PHP中使用正则表达式


    • 让我们把代码分成两行

      preg_replace("~[^0-9]~", "", $phone);
      
      首先,我们将用空字符串替换正则表达式的匹配项(换句话说,从字符串中删除匹配项)。正则表达式是
      [^0-9]
      (两端的
      ~
      是一个数组)<代码>[…]在正则表达式中定义了,它告诉正则表达式引擎匹配类中的一个字符。破折号通常是字符类中的特殊字符,用于指定范围(即
      0-9
      表示
      0
      9
      之间的所有字符)

      您可以将字符类看作是大型
      条件的速记:即
      [0-9]
      1、2、3、4、5、6、7、8或9的速记。请注意,类不必包含范围,或者--
      [aeiou]
      是匹配
      a或e或i或o或u
      的字符类(或者换句话说,任何元音)

      当类中的第一个字符是
      ^
      时,该类被取反,这意味着正则表达式引擎应该匹配任何不在该类中的字符。因此,当您将所有这些放在一起时,第一行将从
      $phone
      中删除任何非数字的内容(介于
      0
      9
      之间的字符)

      preg_match('~([0-9]{3})([0-9]{3})([0-9]{4})~', $phone, $matches);
      
      第二行尝试将
      $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]
      )。

      让我们将代码分成两行

      preg_replace("~[^0-9]~", "", $phone);
      
      首先,我们将用空字符串替换正则表达式的匹配项(换句话说,从字符串中删除匹配项)。正则表达式是
      [^0-9]
      (两端的
      ~
      是一个数组)<代码>[…]
      在正则表达式中定义了,它告诉正则表达式引擎匹配类中的一个字符。破折号通常是字符类中的特殊字符,用于指定范围(即
      0-9
      表示
      0
      9
      之间的所有字符)

      您可以将字符类看作是大型
      条件的速记:即
      [0-9]
      1、2、3、4、5、6、7、8或9的速记。请注意,类不必包含范围,或者--
      [aeiou]
      是匹配
      a或e或i或o或u
      的字符类(或者换句话说,任何元音)

      当类中的第一个字符是
      ^