为什么PHP preg_*函数需要regexp分隔符?

quo*_*tor 2 php regex

这让我烦恼:

为什么preg_match('/pattern/', $haystack)而不是preg_match('pattern', $haystack)?我所看到的一切只是说明它们是必要的,并且提到你可以使用备用分隔符.

但是,它是一个在字符串之外定义自己的接口的函数.它有一个flags参数.添加字符串内的语法似乎反复无常.

它是继承自pcre的东西吗?作者对于解决这些问题并不感兴趣?PHP的又一个不正确的事实?还是有理由吗?

Mic*_*ski 5

分隔符是为了与Perl兼容.Perl正则表达式使用分隔符,并依赖结束分隔符来表示修饰符标志的开始,例如i,不区分大小写.

// Match alpha-numeric, case insensitive, multiline
preg_match('/^[a-z0-9]+$/im', $input);
Run Code Online (Sandbox Code Playgroud)

可选的flags参数preg_match()不会像i第二个分隔符那样实现正则表达式标志.它们提供不同的功能,实际上PREG_OFFSET_CAPTURE是那里唯一的标志.这并不是说正则表达式标志不能作为另一个函数参数实现.他们当然可以拥有,但Perl兼容性是这里的目标.

PHP并不是直接从Perl借用来实现正则表达式的唯一语言.JavaScript在某种程度上做了,Ruby甚至=~为正则表达式匹配实现了Perl的运算符.