1

在以下 PHP 代码(不是我的)中:

$has_trailing_slash = preg_match(':/$:', $string);

冒号的目的是什么?如果我删除它们,那么 preg_match 调用会抱怨字符串中没有尾部斜杠。使用冒号,preg_match 不会在没有尾部斜杠时抱怨。显然,冒号是某种条件或可选指示符,但这是否记录在任何地方?我找不到一个关于以这种方式将冒号与 preg_match 或一般的正则表达式一起使用的文档。

4

3 回答 3

3

这里的冒号用作分隔符。

您需要在 PHP 中为正则表达式使用分隔符,以便正则表达式引擎可以知道正则表达式的开始位置和正则表达式的结束位置,这不包括您在函数中使用的引号。

这一点特别重要,这样正则表达式引擎可以区分实际的正则表达式和要使用的标志(如果有的话)(例如i(用于不区分大小写的匹配)、s(使点匹配换行符)、u(允许 unicode 字符匹配) , ETC)

您可以使用多种分隔符,并且可以根据情况使用“合适的”分隔符。例如,最常用的分隔符是正斜杠:/. 当您使用正斜杠作为分隔符时,您必须转义正则表达式中的正斜杠(通过使用反斜杠)。

否则,您可以更改分隔符本身,也就是说,您可以使用分隔符,例如#, or !or |or or ~or{}等​​等,只要它不是字母数字或反斜杠即可。

这意味着您可以使用:

preg_match(':/$:', $string);
preg_match('"/$"', $string);
preg_match('@/$@', $string);
preg_match('{/$}', $string);

但是如果你使用/,你必须/像这样转义正则表达式中的任何内容:

preg_match('/\/$/', $string);   # Either use a backslash
preg_match('/[/]$/', $string);  # Or wrap it around square brackets

甚至像这样奇怪的东西:

preg_match('\'/$\'', $string);

使用它很可能会使阅读您的代码的人感到困惑,并且正则表达式可以被认为是足够令人困惑的!

结论,您有多种分隔符可供选择,但如果您保持一致并且尽量不让您的代码混乱,则最好。

于 2013-09-24T15:33:33.633 回答
3

我猜那些是分隔符。的替换/,因为/您的正则表达式模式中有一个。因此,使用/将需要转义它。为避免转义,您可以使用不同的分隔符。

所以,即使这些是有效的 - #/$#, !/$!, ~/$~, ...

于 2013-09-24T15:33:34.350 回答
0

:是分隔符... php是灵活的,您可以使用多个符号作为分隔符以避免转义。

于 2013-09-24T15:42:15.220 回答