我发现这个正则表达式可以正常工作,但我不明白#
(在开始时(和表达式结束时是什么。不是^
和$
开头/结尾字符吗?
preg_match_all('#^/([^/]+)/([^/]+)/$#', $s, $matches);
谢谢
匹配模式包含许多/
,因此#
被用作正则表达式。这些是相同的
/^something$/
和
#^something$#
如果您的模式中有多个/
,则第二个示例更适合避免使用'/
进行丑陋的遮罩。以下是 RE 希望使用标准//
语法的方式:
/^'/([^'/]+)'/([^'/]+)'/$/
关于#
:
这是正则表达式本身的分隔符。它的唯一含义是告诉表达式使用哪个分隔符。通常使用/
,但其他也可以使用。PCRE 表达式需要一个带有 preg_match
或 preg_match_all
的分隔符。
关于^
:
在字符类([...]
(中,如果^
是第一个字符,则具有"not"的含义。
[abc] : matching a, b or c
[^abc] : NOT matching a, b or c, match every other character instead
这里开头和结尾的 # 也是自定义正则表达式分隔符。而不是通常的/.../
你有#...#
.就像perl一样。
这些是分隔符。 您可以使用所需的任何分隔符,但它们必须出现在正则表达式的开头和结尾。
有关正则表达式的详细信息,请参阅此文档:http://www.php.net/manual/en/pcre.pattern.php
你几乎可以使用任何东西作为分隔符。最常见的是 /.../
,但如果模式本身包含 /
并且您不想转义任何和所有出现,则可以使用不同的分隔符。我个人的偏好是(...)
,因为它提醒我,结果$0
是整个模式。但是你可以做任何事情,<...>
,#...#
,%...%
,{...}
...好吧,几乎任何东西。我不知道确切的要求是什么,但我认为它是"任何非字母数字字符"。
让我分解一下:
#
是第一个字符,所以这是用作正则表达式分隔符的字符 - 我们知道当我们到达下一个(未转义的(其中一个字符时,我们必须走到最后
^
字符类之外,这意味着字符串的开头
/
只是一个普通的"斜杠"字符
([^/]+)
这是一个带括号的表达式,包含至少一个 ( +
( 个不是/的字符的实例(^
在字符类的开头反转字符类 - 这意味着它只会匹配不在此列表中的字符(
再次/
再次([^/]+)
再次/
$
匹配字符串的末尾
#
这是最后的分律,所以我们知道正则表达式现在已经完成。