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