Ответ 1
Как сказал Майк Брант в своем ответе: "Нет ничего плохого в использовании каких-либо функций preg_*
, если они вам понадобятся.
Вы хотите знать, неплохо ли иметь что-то вроде 20 preg_match
вызовов в одном файле, ну, честно: я бы сказал, что слишком много. Я часто утверждал, что "если ваше решение проблемы зависит от более чем 3 регулярных выражений в любой момент времени, вы являетесь частью проблемы". Однако я иногда грешил против своей собственной мантры.
Если вы используете 20 preg_match
звонков, скорее всего, вы можете вдвое сократить это число, просто взглянув на реальные регулярные выражения. Regex's, особенно регулярное выражение Perl, невероятно мощное, и стоит потратить время, чтобы узнать их. Причина, по которой они, как правило, медленнее, - это просто потому, что регулярное выражение должно анализироваться и "переводиться" на значительное количество ветвей и петель на некотором низком уровне. Если, скажем, вы хотите заменить весь нижний регистр a
на верхний регистр char, вы можете использовать регулярное выражение, конечно, но в PHP это будет выглядеть так:
preg_replace('/a/','A',$string);
Посмотрите на выражение, первый аргумент: это строка, которая передается как аргумент. Эта строка будет проанализирована (при синтаксическом анализе, флаги будут проверены, будет создана строка соответствия, а затем строка будет итерирована, каждый char будет сопоставлен с шаблоном (в данном случае a
), и если подстрока совпадает, он заменен.
Кажется, что это немного, но особенно учитывая, что последний шаг (сравнение подстрок и замены матчей) - это все, чего мы действительно хотим.
$string = str_replace('a','A',$string);
Это просто, без дополнительных проверок, выполняемых при регулярном анализе регулярных выражений.
Не забывайте, что preg_match
также создает массив совпадений, и построение массива также не является бесплатным.
Короче: регулярное выражение медленнее, потому что выражение анализируется, проверяется и, наконец, преобразуется в набор простых инструкций низкого уровня.
Обратите внимание, что в некоторых случаях люди используют explode
и implode
для строковых манипуляций. Это также создает массив, который не может быть свободным. Учитывая, что вы сразу же взорвали тот же самый массив. Возможно, еще один вариант более желателен (и в некоторых случаях preg_replace
может быть быстрее здесь).
В основном: регулярное выражение нуждается в дополнительной обработке, что простые строковые функции не требуют. Но когда есть сомнения, существует только один способ быть абсолютно уверенным: настройте тест script...