PHP正则表达式分隔符,有什么作用?

17
为什么PHP正则表达式需要使用定界符?如果模式修饰符可以作为函数的参数传递,似乎这样会更加清晰。

这是设计不良的结果,这是唯一真正的答案。标志应该是他们API的一个单独部分,因为使用分隔符很麻烦。 - Robo Robok
3个回答

17

分隔符的原因是为了在模式后面放置标志。可以说标志可以作为单独的参数传递(Java可以这样做),但最初Perl就是这样做的(以及之前的sed/awk/vi),所以现在也是这样做的。

不要使用斜杠:它们太常见了。个人几乎总是使用!字符。我很少会寻找它。


1
注意:Java还可以在正则表达式中包含标志,在其开头使用(?m)表示多行,例如。 (?s)表示dotall,(?ms)表示两者,等等。 - VonC
所以Perl、PCRE甚至PHP的preg函数都可以。但是preg函数有一些额外的标志,只能在正则表达式之后指定。 - Jan Goyvaerts
“太常见”是指在模式中出现的可能性太大吗? - outis
2
“那是旧工具的做法”这一论点的问题在于,与列出的所有其他工具不同,PHP没有正则表达式的文字语法。相反,整个正则表达式嵌入到一个字符串中,但该字符串被构造成“看起来像”旧工具中使用的文字。 - IMSoP
如果你把 (?!foo) 作为分隔符,那么如何使用负向先行断言呢?是 (?!foo) 吗? - Adam

7

没有技术上的原因要求它必须这样。

正如评论中所指出的那样,底层库并不要求标志作为 regexp 的一部分进行传递 - 实际上,扩展程序必须将其剥离并作为单独的参数进行传递。

看起来,最初的实现者试图使它看起来像 grep/sed/awk/perl 等工具,以便对从这些工具转换过来的程序员更加熟悉。


4
PCRE 不允许任何分隔符包围正则表达式。在 PHP 的 preg 函数将其传递给 PCRE 库之前,会剥离这些分隔符。 - Jan Goyvaerts
3
哇,那么这都是为了模仿 Perl 而费力吗?我曾经宽容地接受这样的语法多年,但现在我可以真正地讨厌它了。谢谢! - Cal
这个回答对于个人观点来说可以接受,但是不正确。 - dreftymac

6
我不知道preg函数的开发者的动机是什么。我唯一能想到的原因是,他们试图过于努力地按照Perl的方式去做事情。
虽然定界符允许在正则表达式中与标志一起指定一个参数,但将标志作为单独的参数指定要干净得多。这是我所知道的每个其他正则表达式库(对于不支持字面正则表达式作为语言特性的语言)都是这样做的,包括PHP的preg函数基于的PCRE库。preg代码确实必须费力地使用正则表达式从字符串中删除正则表达式定界符,然后才能将其传递给PCRE。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接