check out the last user contributed note on this page
http://php.net/manual/en/regexp.reference.delimiters.php
当使用 PCRE 函数的时候,模式需要由分隔符闭合包裹。分隔符可以使任意非字母数字、非反斜线、非空白字符。
经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。下面的例子都是使用合法分隔符的模式。
/foo bar/ #^[^0-9]$# +php+ %[a-zA-Z0-9_-]%
如果分隔符需要在模式内进行匹配,它必须使用反斜线进行转义。如果分隔符经常在 模式内出现, 一个更好的选择就是是用其他分隔符来提高可读性。
/http:\/\// #http://#
除了上面提到的分隔符,也可以使用括号样式的分隔符,左括号和右括号分别作为开始和结束 分隔符。
{this is a pattern}
可以在结束分隔符后面增加模式修饰符。 下面的例子是一个大小写不敏感的匹配:
#[a-z]#i
check out the last user contributed note on this page
http://php.net/manual/en/regexp.reference.delimiters.php
you guys can call me for sex
+852 92606871
The dirty little delimiter secret they don't tell you ->
Examples: Balanced delims {\d{2}Some\\{33\\}\w{5}} parses to
\d{2}Some\\{33\\}\w{5} and {\d{2}Some\{33\}\w{5}} parses to \d{2}Some{33}\w{5}.
Un-Balanced delims +\d{2}Some\+33\+\w{5}+ parses to \d{2}Some+33+\w{5} and
+\d{2}Some\\+33\\+\w{5}+ won't parse because the delimiter is unescaped.
A delimiter can be any ASCII non-alphanumeric, non-backslash, non-whitespace character: !"#$%&'*+,./:;=?@^_`|~- and ({[<>]})
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
preg_match('{[\}]}', ''); // OK
Note that bracket style opening and closing delimiters aren't a 100% problem-free solution, as they need to be escaped when they aren't in matching pairs within the expression. That mismatch can happen when they appear inside character classes [...], as most meta-characters lose their special meaning. Consider these examples:
<?php
preg_match('{[{]}', ''); // Warning: preg_match(): No ending matching delimiter '}'
preg_match('{[}]}', ''); // Warning: preg_match(): Unknown modifier ']'
preg_match('{[}{]}', ''); // Warning: preg_match(): Unknown modifier ']'
?>
Escaping them solves it:
<?php
preg_match('{[\{]}', ''); // OK
preg_match('{[}]}', ''); // OK
preg_match('{[\}\{]}', ''); // OK
?>