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中使用正则表达式
- 让我们把代码分成两行
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
的字符类(或者换句话说,任何元音)
当类中的第一个字符是^