вторник, 17 июля 2012 г.

str_replace vs. preg_replace


Хочу вам сегодня рассказать об одном недостатке функции str_replace, которая иногда очень сильно портит жизнь.
Своего времени был заказ сделать "умную подстановку" смайликов - чтобы в одном сообщении было не больше 10 смайлов, остальные должны были просто отображаться как текст. Логика в этом определенно есть - ведь многие браузеры (особенно телефоны) раньше очень плохо переносили большое количество смайлов. За времён моего пребывания в чате awap.ru находились те, которые зафлуживали сообщения смайлами, и после захода на страницу телефон зависал до того уровня, что приходилось вынимать батарейку.

Но тут оказалось, что параметр count в str_replace совсем не регулирует количество замен, а принимает ссылку, в которой будет уже число готовых замен.
То есть, сделав так:
<?php
$in=3;
$t=str_replace('!', '?', $t, $in);
?>
мы никак не ограничим количество замен, а в переменной in будет их количество. Кажется, стоит лишь посчитать, если замен уже больше 10 - остановить исполнение. Но таким образом можно вывести 50 смайликов одного типа, и остановить это будет очень сложно. Думаю, есть несколько решений этой проблемы, но тем, которым я воспользовался, это функция preg_replace.
В этой же функции есть возможность ограничения количества замен, и использовать его надо так:
<?php
$in=3;
$t=preg_replace('/!/', '?', $t, $in);
?>
В результате будет исполнено только три замены.
Большой минус использования preg_replace - возможная потеря скорости при обработке больших строк. Кроме того, надо экранировать спец-символы, который могут восприниматься парсером как управляющие символы шаблона.
Экранировать же эти символы можно с помощью preg_quote, не забывайте при этом указывать второй параметр.

Удачи!

Комментариев нет:

Отправить комментарий