Почему есть и str_replace (), и preg_replace ()? - PullRequest
3 голосов
/ 16 декабря 2009

Я познакомился с PHP после Perl, поэтому, когда я впервые нашел функцию preg_ *, я просто использовал ее. Позже я прочитал, что str_replace() быстрее при работе с буквальным текстом. Поэтому мой вопрос: не может ли preg_replace() быть столь же эффективным, как str_replace(), когда в шаблоне поиска не используются специальные символы? Может быть, просто анализируя паттерн для выбора между алгоритмами регулярного выражения и обычного текста?

Ответы [ 8 ]

7 голосов
/ 16 декабря 2009

Теоретически да, вы правы. Возможно, команда PHP могла бы джиггером preg_replace проанализировать передаваемый шаблон и затем использовать код для str_replace, если не увидела мета-символов. Предполагая, что анализ не был слишком тяжелым, это может дать лучшие результаты производительности.

Однако то, как организован исходный код PHP (то есть код, используемый для реализации PHP), не подходит для такого совместного использования. PHP (в некотором смысле) является менее полным языком и скорее набором модулей.

Итак, изначально группа PHP решила держаться подальше от такого кросс-модульного опыления. На этом этапе изменение функции preg_replace для такого анализа может привести к поломке большого количества кода, а повышение производительности будет незначительным.

Наконец, сам анализ является более сложной проблемой, чем вы думаете. Скажите, а этот шаблон

 '/123/'

значит, я должен искать буквальный текст

123

или буквальный текст

/123/

Легко придумать убедительные аргументы для любой интерпретации, что вводит дополнительный уровень путаницы в использование функции.

Интересная идея в теории, но на практике и в контексте вселенной PHP она создает гораздо больше проблем, чем решает.

5 голосов
/ 16 декабря 2009

Может быть, просто анализирую выбирать между регулярным выражением и простым текстом алгоритмы?

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

0 голосов
/ 18 декабря 2009

Невозможно заменить str_replace() на preg_replace(), поскольку функция не может понять, пытаюсь ли я использовать сопоставление с образцом или обычную замену строки. Это было бы возможно, если бы новая функция принимала новый параметр, но в этом случае вы бы столкнулись с проблемой несовместимости для старого кода.

Изменение preg_replace(), чтобы оно понимало, что следует произвести замену строки, не сделает ее оптимизированной. Следует проверить строку, переданную в качестве аргумента, и понять, что я запрашиваю заменить строку другой; проверка этого потребует времени, которое может быть использовано для разрешения сопоставления с образцом.

0 голосов
/ 17 декабря 2009

Может быть, просто анализируете шаблон для выбора между алгоритмами регулярных выражений и обычным текстом?

Одно это снизит производительность. Кроме того, preg_*() функции используют библиотеку, которая не нужна для более простых строковых операций.

0 голосов
/ 16 декабря 2009

Вот как это работает в JavaScript

alert("a.b".replace(".", "X")) // aXb
alert("a.b".replace(/./, "X")) // X.b

то есть одна функция может принимать как подстроки, так и специальные литералы регулярных выражений. Литералы Regexp чрезвычайно удобны, и вся строковая библиотека может быть уменьшена и более гибкой (представьте себе один split вместо «explode» и «preg_split», pos вместо «strpos» и «preg_match» и т. Д.).

при этом я очень сомневаюсь, что литералы регулярных выражений могут быть добавлены в php в ближайшее время.

0 голосов
/ 16 декабря 2009

Несмотря на сходства, обе функции совершенно разные, поэтому не взаимозаменяемы. Например, замена в preg_replace может содержать обратные ссылки на текст, захваченный регулярным выражением:

preg_replace ('/(\w+) apple/', '$1 pear', 'A red apple'); // => 'A red pear'
0 голосов
/ 16 декабря 2009

Я думаю, что разница в скорости приводит к накладным расходам, которые добавляет анализатор / движок регулярных выражений по сравнению с тем, как работает str_ *. Но я просто догадываюсь здесь. В случае сомнений сравните результаты и посмотрите, будет ли он быстрее или с такой же скоростью:)

Существует длинная и подробная статья о Скорость сопоставления регулярных выражений , а в Википедии есть некоторая информация о Реализациях и времени выполнения и Сравнение механизмов регулярных выражений .

0 голосов
/ 16 декабря 2009

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

если у вас есть пробелы, которые могут быть сопоставлены с шаблоном, используйте preg, иначе попытайтесь с str_replace.

хотя попытка сделать то же самое в preg с str_replace, на самом деле медленнее, если вы делаете сложные вещи.

Джо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...