PHP正则表达式-使用元字符作为分隔符

PHP正则表达式-使用元字符作为分隔符,php,regex,Php,Regex,所以我一直在阅读php(PCRE)正则表达式doco,我注意到关于分隔符()的部分说: 分隔符可以是任何非字母数字、非反斜杠、非空白字符 它还讨论了使用括号作为分隔符: 括号样式的分隔符在模式中用作元字符时不需要转义,但与其他分隔符一样,在用作文字字符时必须转义 我的问题是,如何使用其他正则表达式元字符作为分隔符,以及在模式中使用它们作为元字符 根据我所做的测试,不可能在模式中同时使用诸如“|”之类的元字符作为分隔符和元字符。我想不出有什么理由需要这样做,但我很好奇“正确”的答案是什么 显然,选

所以我一直在阅读php(PCRE)正则表达式doco,我注意到关于分隔符()的部分说:

分隔符可以是任何非字母数字、非反斜杠、非空白字符

它还讨论了使用括号作为分隔符:

括号样式的分隔符在模式中用作元字符时不需要转义,但与其他分隔符一样,在用作文字字符时必须转义

我的问题是,如何使用其他正则表达式元字符作为分隔符,以及在模式中使用它们作为元字符


根据我所做的测试,不可能在模式中同时使用诸如“|”之类的元字符作为分隔符和元字符。我想不出有什么理由需要这样做,但我很好奇“正确”的答案是什么

显然,选择一个在模式中可能具有特殊意义的分隔符可能会引起头痛,这应该很容易避免。当然,不要这样做

但为了满足您的好奇心,您的观察结果似乎是正确的,即如果将字符用作分隔符,则无法保留其特殊含义。让我们浏览一下相关文档,看看原因。(为了简单起见,这里省略了一些代码。)

首先,它跳过遇到的任何前导空格

while (isspace((int)*(unsigned char *)p)) p++;
然后,选择分隔符
作为字符串中的第一个字符

delimiter = *p++;
接下来,确定
结束定界符
是否与
开始定界符
相同,或者它是否将是开始括号字符的补充字符(即
补充
]
补充
[
,等等).回想一下手册是如何明确说明括号样式字符是以这种方式进行特殊处理的

start_delimiter = delimiter;
if ((pp = strchr("([{< )]}> )]}>", delimiter)))
    delimiter = pp[5];
end_delimiter = delimiter;

pp = p;
所有这些都非常简单,但一旦找到分隔符,包含的
模式
将被确定为两个分隔符字符之间的逐字字符串

pattern = estrndup(p, pp-p);
因此,最初在模式中转义的任何字符仍将作为转义字符传输到底层PCRE函数中的模式解析器本身

re = pcre_compile(pattern, ...
此时,无论您选择了哪个分隔符,隔离模式都是相同的。实际的正则表达式引擎完全不受您选择的影响


我希望这就是你要问的。:-

事实上,当PHP接受(在他们的示例中)
+
作为分隔符时,我很惊讶,而这也是正则表达式中的元字符。
re = pcre_compile(pattern, ...