2013-09-24 149 views
1

在下面的PHP代码(不是我):preg_match模式中的冒号是什么?

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

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

+1

请参阅[PCRE分隔符](http://www.php.net/manual/en/regexp.reference.delimiters.php)文档。 –

回答

3

这里的冒号用作分隔符。

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

,这是特别重要的,使得正则表达式引擎可以在实际的正则表达式和标志(如果有的话)的使用之间的区别(例如i(为不区分大小写匹配),s(使点匹配换行符),u (以允许Unicode字符匹配)等)

您可以使用各种分隔符,您可以根据具体情况使用'合适'分隔符。例如,最常用的分隔符是正斜杠:/。当您使用正斜杠作为分隔符时,您将不得不在正则表达式中使用正斜杠(通过使用反斜杠)。

否则,您可以更改分隔符本身,这表示,你可以使用一个分隔符,如#,或!|~{}等等,只要不是字母,数字或反斜线。

这意味着您可以使用:

preg_match(':/$:', $string); 
preg_match('"/$"', $string); 
preg_match('@/[email protected]', $string); 
preg_match('{/$}', $string); 

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

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

甚至一些怪异的这:

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

使用这将很可能混淆阅读你的代码和正则表达式的人可能会被认为是足够混乱!

结论,你有各种各样的分隔符可供选择,但如果你一致并且尽量不让你的代码混淆,那么这是最好的。

3

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

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

0

:是定界符... php是灵活的,你可以使用一些符号站作为分隔符,以避免逃逸。

相关问题