Forum Webscript.Ru

Программирование => PHP => Тема начата: ZMeY от 24 Июля 2003, 22:48:59

Название: Замена слова смайликом
Отправлено: ZMeY от 24 Июля 2003, 22:48:59
Подскажите оптимальный алгоритм замены ключевого слова в тексте на определённое изображение.
Всего существует порядка 50 разных ключевых слов, записаных в массив примерно в таком виде:

function Check4Smilies(&$substring)
{
$Table = Array(
   "*88"   => ("smile1.gif"),
      "*один"   => ("smile2.gif")
);

         while(list($key, $prop) = each($Table))
         {
                $substring = str_replace($key, " \\"".$key."\\" ", $substring);
         };
unset($Table);
}
Название: Замена слова смайликом
Отправлено: ZMeY от 24 Июля 2003, 22:50:38
Данный алгоритм работает очень медленно.
Название: Замена слова смайликом
Отправлено: nagash от 24 Июля 2003, 23:10:43
$code = array("=)", ":)");
$smile= array("cool.gif", "yep.gif");
$text = str_replace($code, $smile, $text);
Название: Замена слова смайликом
Отправлено: ZMeY от 24 Июля 2003, 23:41:12
А как быть с  \\"".$key."\\"
не вписывать же для каждого смайла в ручную
Название: Замена слова смайликом
Отправлено: Макс от 25 Июля 2003, 02:32:27
ZMeY
ну если ты такой ленивый то

function _i($prop, $key) {
 return "\\"".$key."\\"";
}
$smiles = array(":)"=>_i("smile.gif",":)"), ....);
$text = str_replace(array_keys($smiles), array_values($smiles),$text);
Название: Замена слова смайликом
Отправлено: ZMeY от 27 Августа 2003, 23:16:47
А как обойтись с регистром, хотелось, бы что бы функция на него не обращала внимания :(
Название: Замена слова смайликом
Отправлено: Макс от 27 Августа 2003, 23:41:34
nagash
[p]str_ireplace[/p]
Цитировать
no version information, might be only in CVS
сомневаюсь что его хостер CVS-версией пользуется

ZMeY
под [p]preg_replace[/p] переписывать с использование модификатора i
Название: Замена слова смайликом
Отправлено: Alexandr от 28 Августа 2003, 10:56:18
Цитировать
Макс:
ну если ты такой ленивый то

Цитировать
Макс:
Из комбинации лени и логики получаются программисты!

[OFF]:^)[/OFF]
Название: Замена слова смайликом
Отправлено: ZMeY от 18 Сентября 2003, 16:50:33
Спасибо, я остановился на варианте Макса.

А каким образом можно ограничить количество замен, скажем семью, ведь такой скрипт - потенциально уязвим для флуда!
Название: Замена слова смайликом
Отправлено: Макс от 18 Сентября 2003, 21:31:33
ZMeY
> А каким образом можно ограничить количество замен
а если повнимательнее почитать мануал ([p]preg_replace[/p]) ?
(см. четвертый параметр)
Название: Замена слова смайликом
Отправлено: ZMeY от 19 Сентября 2003, 15:21:00
В коде

function _i($prop, $key)
{
return " \\"".$key."\\" ";
}

$smiles = array(    "\\*:)" => _i("smile","*:)"),
                    "\\*;)" => _i("wink","*;)")
);

function Check4Smilies(&$substring, $SmTable)
{
$substring = preg_replace(array_keys($SmTable), array_values($SmTable),$substring,7);
}

Check4Smilies($M, $smiles);
unset($smiles);
?>

Возникает ошибка чтото в виде "Delimiter must.." и.т.д.
В чём проблема?
Название: Замена слова смайликом
Отправлено: ZMeY от 19 Сентября 2003, 15:22:40
там где рожи на самом деле смайлы двоеточие-скобка и точка с запятой-скобка
Название: Замена слова смайликом
Отправлено: Макс от 19 Сентября 2003, 16:51:42
1. править => отключить иконки в данном сообщении (это отключение смайликов)
2. полный текст ошибки какой ?
Название: Замена слова смайликом
Отправлено: ZMeY от 19 Сентября 2003, 17:25:37
Я немного ошибся в коде, он выглядит так:

function _i($prop, $key)
{
return " \\"".$key."\\" ";
}

$smiles = array(    "\\*:)" => _i("smile","*:)"),
                    "\\*;)" => _i("wink","*;)")
);

function Check4Smilies(&$substring, $SmTable)
{
$substring = preg_replace(array_keys($SmTable), array_values($SmTable),$substring,7); // это и естиь 13 строка
}

Check4Smilies($M, $smiles);
unset($smiles);
?>

А ошибка такая:
Delimiter must not be alphanumeric or backslash in c:\\http\\home\\localhost\\www\\lib\\smilies.lib.php on line 13
Название: Замена слова смайликом
Отправлено: Макс от 19 Сентября 2003, 18:27:38
лень проверять, наверное ошибка здесь:
$smiles = array( "\\*:)" => _i("smile","*:)"),
"/\\*;)/" => _i("wink","*;)")
);
Название: Замена слова смайликом
Отправлено: ZMeY от 19 Сентября 2003, 19:10:45
Тогда получаем ошибку:
Warning: Compilation failed: unmatched parentheses at offset 3 in c:\\http\\home\\localhost\\www\\lib\\smilies.lib.php on line 13