Php 这些符号/部件在preg_match中的含义是什么?

Php 这些符号/部件在preg_match中的含义是什么?,php,preg-match,Php,Preg Match,我对preg_match略知一二,但是有些看起来相当复杂,有些包含我不完全理解的符号。例如: 关于第一个-我只能假设这与电子邮件地址和url有关,但是像[^/]和这样的东西意味着什么 preg_match('@^(?:http://)?([^/]+)@i', $variable); preg_match("/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/", $variable); 在第二个-像^、{5}和$这样的东西是什么意思 preg_match('@^(?:http://)?

我对
preg_match
略知一二,但是有些看起来相当复杂,有些包含我不完全理解的符号。例如:

关于第一个-我只能假设这与电子邮件地址和url有关,但是像
[^/]
这样的东西意味着什么

preg_match('@^(?:http://)?([^/]+)@i', $variable);
preg_match("/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/", $variable);

在第二个-像
^
{5}
$
这样的东西是什么意思

preg_match('@^(?:http://)?([^/]+)@i', $variable);
preg_match("/^[A-Z]{5}[0-9]{4}[A-Z]{1}$/", $variable);

只是这些小事情我不能完全确定,如果能简单解释一下,我将不胜感激

虽然我不喜欢只发布链接,但我觉得正则表达式教程太多了。所以,看看这个,如果你已经对它的作用有了一点了解,它可能会让你走上正轨


此外,还可以查看一些解释和更有用的链接

以下是直接的答案。我把它们写得很短,因为如果不理解正则表达式,它们就没有意义。这种理解最好是在工作中获得的。我建议您也尝试一下这里列出的regex助手工具,它们允许您进行实验-在编辑模式时查看实时捕获/匹配,非常有用

围绕某个对象的简单括号()使其成为一个组。这里有(?=)这是一个断言,特别是一个积极的前瞻断言。它所做的只是从当前光标在干草堆中的位置向前看,检查里面的东西是否确实存在。还和我在一起吗? 示例:foo(?=bar)仅当后跟bar时才与foo匹配。永远不匹配条,只返回foo

考虑到这一点,让我们分析一下您的正则表达式:

 /^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/

Reads as:
    ^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
    .*$ 0-many of anything preceding the End
第一个:

@
实际上与匹配的内容无关。通常,在正则表达式中使用
/
作为分隔符。缺点是,每当你想使用它时,你都需要逃避它。所以这里,
@
用作分隔符

[^/]
是一个字符组
[/]
将只匹配
/
字符,
^
将其反转<代码>[^/]
匹配除
/
之外的所有字符

第二个:

^
匹配字符串的开头,
$
匹配字符串的结尾。您可以使用它强制正则表达式必须应用于匹配的整个字符串

{5}
是一个量词。它相当于
{5,5}
,最小5个,最大5个,因此它正好匹配5个字符。

第一个:
[^/]
=除斜杠外的所有内容

第二个:
^
从$variable开头查看
{5}
正好出现5次[A-Z]
$
查看,直到到达$variable的末尾

^和$
的组合意味着这两者之间的所有内容都必须应用于$variable