Разделитель регулярных выражений PHP, какой смысл?

Почему регулярные выражения PHP имеют окружающие разделители? Похоже, было бы более понятно, были ли какие-либо модификаторы шаблонов переданы как параметр для любой функции.

Ответ 1

Нет никаких технических причин, почему это должно быть так.

Как отмечено в комментарии, базовая библиотека не требует, чтобы флаги были переданы как часть регулярного выражения - на самом деле расширение должно отключить их и передать их как отдельный аргумент.

Похоже, что первоначальный разработчик пытался сделать его похожим на grep/sed/awk/perl/etc, чтобы он был более знаком программистам, пришедшим из этих инструментов.

Ответ 2

Причиной разграничителя является установка флагов после шаблона. Аргументируемые флаги могут быть переданы как отдельный параметр (Java может сделать это таким образом), но то, как Perl сделал это изначально (и sed/awk/vi перед ним), чтобы как это было сделано сейчас.

Не используйте косые черты: они слишком распространены. Лично я почти всегда использую! персонаж. Я почти никогда не искал этого.

Ответ 3

Я не знаю, каковы были мотивы разработчиков preg-функций. Единственная причина, по которой я могу думать, это то, что они слишком старались сделать что-то на Perl.

В то время как разделители позволяют указывать флаги вместе с регулярным выражением как один параметр, указание флажков в качестве отдельного параметра намного чище. Это как любая другая библиотека регулярных выражений (для языков, которые не поддерживают литералы регулярных выражений в качестве языковой функции), я знаю это, включая библиотеку PCRE, на которой основаны функции PHP preg. Код preg действительно должен пройти через проблему удаления разделителей регулярных выражений из строки с вашим регулярным выражением, прежде чем он сможет быть передан в PCRE.