Почему у регулярных выражений PHP есть окружающие разделители? Похоже, было бы более понятно, были ли какие-либо модификаторы шаблонов переданы в качестве параметра для любой функции.
Нет никаких технических причин, почему это должно быть так.
Как отмечено в комментарии, основная библиотека не требует, чтобы флаги были переданы как часть регулярного выражения – на самом деле расширение должно отключить их и передать их как отдельный аргумент.
Похоже, что первоначальный разработчик пытался сделать его похожим на grep / sed / awk / perl / etc, чтобы он более привык для программистов, исходящих из этих инструментов.
Причиной для разделителя является установка флагов после шаблона. Аргументируемые флаги могут быть переданы как отдельный параметр (Java может сделать это таким образом), но именно так Perl сделал это изначально (и sed / awk / vi перед этим), так вот как это делается сейчас.
Не используйте косые черты: они слишком распространены. Лично я почти всегда использую! персонаж. Я почти никогда не искал этого.
Я не знаю, какие были мотивы разработчиков preg-функций. Единственная причина, по которой я могу думать, это то, что они слишком старались сделать что-то на Perl.
В то время как разделители позволяют указывать флаги вместе с регулярным выражением как один параметр, указание флагов как отдельного параметра намного чище. Вот как каждая другая библиотека регулярных выражений (для языков, которые не поддерживают литералы регулярных выражений в качестве языковой функции), я знаю это, включая библиотеку PCRE, на которой основаны функции preg PHP. Код preg действительно должен пройти через проблему удаления разделителей регулярных выражений из строки с вашим регулярным выражением, прежде чем он сможет быть передан в PCRE.