preg_match模式中的冒号是什么?

时间:2013-09-24 15:32:48

标签: php regex

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

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

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

3 个答案:

答案 0 :(得分:3)

此处的冒号用作分隔符。

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

这一点非常重要,因此正则表达式引擎可以区分实际的正则表达式和要使用的标志(如果有的话)(例如i(用于不区分大小写的匹配),s(到make dot match newlines),u(允许unicode字符匹配)等)

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

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

这意味着您可以使用:

{}

但是如果您使用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

使用它很可能会让读取代码和正则表达式的人感到困惑!

结论,您可以选择多种分隔符,但如果您保持一致并尽量不使代码混淆,则更为可取。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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