Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтр слов 
:(
    Опции темы
Gold Dragon
  Дата 30.1.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Допустим есть гостевая книга. Сообщения оставляются без предварительной модерации. Есть список слов (мат и т.п.) которые нужно находить в сообщении и заменять

Вопрос:
- как грамотнее организовать проверку и замену? И главное, какие функции быстреке будут работать?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 30.1.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Зависит от кол-ва слов и сложности правил...
В принципе и preg-replace() - 1 раз можно прогнать.
PM ICQ   Вверх
AztEK
Дата 30.1.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



А в идеале ещё и заменять слова, где скажем вместо русских букв используются латинские со схожим написанием.
Тут, наверное, стоит все схожие символы ложить в массив и прегать по массиву.
Правда не знаю насчёт скорости...


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Gold Dragon
Дата 30.1.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Mal Hack
почитал документацию и не совсем понял как это использовать

вот например нужно в сообщении делать следующие замещения
- aaa на ббб
- 1234 на 4321
- ёй на юй

а код типа такого

Код

$a = array ("ааа","1234","ёй");
$b = array ("ббб","4321","юй");
$str = "Строка в которой нужно искать и заменять";
$itog = preg_replace ($a, $b, $str);


так чтоли?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
AntonioBanderaz
Дата 30.1.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Velichko Anton
**


Профиль
Группа: Участник
Сообщений: 851
Регистрация: 28.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 18



Цитата(Gold Dragon @ 30.1.2006, 14:25 Найти цитируемый пост)

так чтоли?

Это вроде str_replace
В преге регульки


--------------------
ГЫ... 
PM MAIL ICQ   Вверх
BIG BROTHER
Дата 30.1.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 9.12.2004
Где: Россия, Москва

Репутация: 1
Всего: 4



быстрее всего будет работать str_replace (т.е. обычная замена без регулярных выражений)
НО правильней ИМХО делать так: в базе хранить корни слов - матов и смотреть в тексте именно эти корни. При нахождении корня заменять все слово в котором этот корень есть (т.е. от пробела до пробела)

Но конечно на 100 уберечся нельзя например вот 2 слова: хорошо и xopoшo - визуально разницы вообще никакой а во втором слове буквы Х О и P- латинские икс, о и пе. да и после каждой буквы пробелов могут понаставить. В идеале конечно нужно все жестко модерировать и карать карой небесной нарушителей smile

Это сообщение отредактировал(а) BIG BROTHER - 30.1.2006, 17:20
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
AztEK
Дата 30.1.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 723
Регистрация: 4.1.2005

Репутация: нет
Всего: 18



BIG BROTHER корни - не дело. Будет резать безобидные слова типа "застрахуйте"


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Mal Hack
Дата 30.1.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Gold Dragon, если так, то:
Код
<?php
// Provides: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// Provides: You should eat pizza, beer, and ice cream every day
$phrase  = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy   = array("pizza", "beer", "ice cream");

$newphrase = str_replace($healthy, $yummy, $phrase);
?>

Если 5 юзаешь, то str_ireplace
PM ICQ   Вверх
Gold Dragon
Дата 31.1.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



BIG BROTHER
наверное всё таки нужна регулярка, т.к. в базе лежат слова, а их надо проверять на наличие не алфавитного знака в начале и в конце. Например, слово "устой" не должно попасть в "плохие" слова по маске "сто", а ".сто" должно попасть. Как мне это сделать регулярными выражениями?

Всем спасибо за пояснение к str_replace. Но как мне совместить это с базой? Или проще это хранить в переменной(Array) в каком-нибудь "языковом" файле? Если в базе, то наверное нужно будет всё равно в массив перегонять?


BIG BROTHER
само сабой, нет 100% защиты и нужна модерация, но я же не могу модерить постоянно online, вот и нужна какая-то элементарная защита пока модератор кушает пончики smile
Добавлено @ 11:07

я юзаю 5-ку


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
BIG BROTHER
Дата 31.1.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 9.12.2004
Где: Россия, Москва

Репутация: 1
Всего: 4



Из базы не сложно перегнать в массив и прогнать str_replace и заменять на что-то вроде [censored] smile
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
Gold Dragon
Дата 1.2.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



BIG BROTHER
Цитата(Gold Dragon @ 31.1.2006, 11:06 Найти цитируемый пост)

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




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.2.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Gold Dragon
Код

$a = array ("ааа","1234","ёй");
$b = array ("ббб","4321","юй");
$str = "Строка в которой нужно искать и заменять";
$itog = preg_replace ("#(\s\.\-\+\=)(".implode($a,"|").")(\s\.\-\+\=)#is", "\1[censored]\3", $str);

PM ICQ   Вверх
PARROT
Дата 3.5.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: нет
Всего: 50



Жизнь заставила сделать фильтр слов:
В текстовом файле записаны слова:
mate.txt
Код

агрегат
агроном
адепт
азербайджанец
азиат
активист
албанец
алигарх
алигофрен

Делаю так:
Код

$badWords = explode("\r\n", file_get_contents("mate.txt"));
$mas_com[4] = str_replace($badWords, "**грязно ругается**", $mas_com[4]);

Результат:
Код

**грязно ругается**егат  (агрегат)
**грязно ругается**ивист (активист) 

Получается, что он слово находит, но заменяет только первые три буквы.
Как исправить?  


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
Serkys
Дата 3.5.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: 2
Всего: 22



PARROT, а откуда у тебя берётся $mas_com? 
PM MAIL   Вверх
PARROT
Дата 3.5.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: нет
Всего: 50



Из базы. В базу пишется текст сообщения, в котором могут содержаться такие слова. 
Потом при выводе нужно все это заменить. 


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
Mal Hack
Дата 3.5.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



А если так:
Код
$badWords = file_get_contents("mate.txt");
$mas_com[4] = str_replace($badWords, "**грязно ругается**", $mas_com[4]);

 
PM ICQ   Вверх
IZ@TOP
Дата 3.5.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 2
Всего: 73



Mal Hack, ммм... а в файле ж слова разделенные переносом строк... 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Mal Hack
Дата 3.5.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Ах, ну да... Сорри, стормозил... Я бы тут альтернативной регуляркой прошолся бы. 
PM ICQ   Вверх
IZ@TOP
Дата 3.5.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 2
Всего: 73



Mal Hack, да уж пробовали - regular expression too long  smile

Добавлено @ 16:59 
Предпологаю что на сервере все прекрасно заработает. У меня во всяком случае проблем не возникло. 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Mal Hack
Дата 3.5.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Надо бы вывести через print_r массив полученных слов и посмотреть. Вероятно он битый.. 
PM ICQ   Вверх
PARROT
Дата 3.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2339
Регистрация: 5.1.2005
Где: Спб-ЦарьГрад

Репутация: нет
Всего: 50



Странно, действительно на сервере все заработало: http://pk.traktora.spb.ru/index.php?page=comment&idp=98

(Меня Денвер начинает раздражать..., второй баг уже) 


--------------------
Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим!
PM MAIL   Вверх
Asbestos
Дата 30.6.2006, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 30.6.2006

Репутация: нет
Всего: нет



Леди и мужики, ситуация следующая: замену в строках произвожу str_ireplace, НО это отказывается воспринимать верхний регистр кириллицы smile Знаю, что дуб и решение простое 

хехе прошу прощения, забыл указать верную локаль 

Это сообщение отредактировал(а) Asbestos - 30.6.2006, 07:48
PM MAIL   Вверх
Gold Dragon
Дата 30.7.2006, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Народ, ещё раз про замену... Что-то код с регуляркой не работает.

$a = array ("aaa", "bbb", "ccc"); // что менять
$b = array ("111", "222", "333"); //yf что менять
$str = "aaa gaaa 1bbb bbb2 ccc qqq bbb! .aaa."; // где менять

в итоге не должны поменяться только "gaaa" и "qqq" 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 30.7.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



А что ты хочешь сделать?
Покажи код. 
PM ICQ   Вверх
Gold Dragon
Дата 30.7.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Mal Hack, я твой пытался запустить

Код

$a = array ("ааа","1234","ёй");
$b = array ("ббб","4321","юй");
$str = "Строка в которой нужно искать и заменять";
$itog = preg_replace ("#(\s\.\-\+\=)(".implode($a,"|").")(\s\.\-\+\=)#is", "\1[censored]\3", $str);


Добавлено @ 17:14 

а так как я в регах ничего не понимаю, так и не разобрался... там явно не хватает $b 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 30.7.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



А тут ты так не сделаешь. Тут надо через preg_replace_callback 
PM ICQ   Вверх
Gold Dragon
Дата 30.7.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Mal Hack, ну тебе виднее, а через preg_replace_callback  как ?
просто через str_replace работает не так. он заменяет внутри слова 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 30.7.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Gold Dragon, поверь, я давно понял почему тебя str_replace не  устраивает smile)

Цитата(Gold Dragon @  30.7.2006,  19:39 Найти цитируемый пост)
ну тебе виднее, а через preg_replace_callback  как ?

Код

function repl( $matches )
{
/*
Тут надо поставиьь в соответствие что на что менять, это раз, а два проверить $matches[1] на не алфавитные символы. Проверь через ctype_*(), может придется и через регулярку.
*/
 return "что надо вернуть";
}
$a = array ("ааа","1234","ёй");
$b = array ("ббб","4321","юй");
$str = "Строка в которой нужно искать и заменять";
$itog = preg_replace_callback("#(\s\.\-\+\=)(".implode($a,"|").")(\s\.\-\+\=)#is", "repl", $str);
 
PM ICQ   Вверх
Gold Dragon
Дата 31.7.2006, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



совсем запутался smile что-то не работает твой код

нужно это
Код

$a = array ("aaa", "bbb", "ccc");
менять на это
Код
$b = array ("111", "222", "333"); 


Mal Hack, зачем мне проверять слова на которые я меняю, ведь это мои слова замены, а не пользовательские?

зы
вот тестовая строка
Код

$str = "aaa gaaa 1bbb bbb2 ccc qqq bbb! .aaa."

 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
GiV
Дата 31.7.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Код

$a = array ("aaa", "bbb", "ccc"); 
$b = array ("111", "222", "333"); 
$str = "aaa gaaa 1aaa bbb2 ccc qqq 3ccc3 bbb! .aaa.";

$str = '~'.$str.'~';

for ($i=0; $i < count($a); $i++) {
    $str = preg_replace("/([^a-z])" . $a[ $i ] . "([^a-z])/ise", "replace('\\1', " . $b[ $i ] . " ,'\\2')", $str);
}

$str = trim($str, '#~');

echo $str;

function replace($pref, $body, $post) {
    return $pref. $body . $post;
}


Должно было работать и без функции replace ($str = preg_replace("/([^a-z])" . $a[ $i ] . "([^a-z])/is", "\\1" . $b[ $i ] . "\\2", $str);), соединяющей куски, но на двух серверах странное поведение было. 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 31.7.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Плохое решение. ЛУчше 1 раз пройтись большой регуляркой, чем много маленькими.
Хотя и не всегда.
Да и замудренно как-то это.
Плюс, модификатор e сильно кушает память и может вызвать неприятности.
Плюс, помним, что ьез установки локали RegEX не будет работать с кирилицей в паттерне.
Код

<?php

    function repl( $matches )
    {
        global $b;
        global $a;
        print_r($matches);
        return $matches[1] . $b[ array_search( $matches[2] , $a ) ] . $matches[3];
    }
    
    $a = array ("aaa","1234","bbb");
    $b = array ("ббб","4321","юй");
    $str = "aaa gaaa 1bbb bbb2 ccc qqq bbb! .aaa.";
    
    $itog = preg_replace_callback("#([\s.-=;])(".implode($a,"|").")([\s.-=;])#i", "repl", $str);

    print $itog;
    
?>
 
PM ICQ   Вверх
GiV
Дата 31.7.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Цитата(Mal Hack @  31.7.2006,  14:35 Найти цитируемый пост)
Плохое решение. ЛУчше 1 раз пройтись большой регуляркой, чем много маленькими.
Хотя и не всегда.

не всегда, хотя в данном случае правда Ваша. preg_replace с модификатором e работает медленне replace_callback 
+ мы всегда будем проходить все n итерации (n-количество элементов в массиве для замены), что в худшем случае (ни одного вхождения искомого ключа в строку) все n раз заставит сработать preg_replace в холостую. В то время как большой прег выполнится только ОДИН раз, там выигрыши получаются от 2-х мс...

И [\s.-=;] все же не все элементы включены (таб, запятая, восклицательный знак, двоеточие и т.д.), класс [^А-Яа-яA-Za-z] все же лучше. 

P.S. при достижении 100 с меня +. 

Это сообщение отредактировал(а) GiV - 31.7.2006, 16:27
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 31.7.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Наверное я слишком многое хочу  smile 


Mal Hack, не все условия выполняются: замена происходит только если в начале стоит цифра, пробелы или точки, остальные не меняются... 

Т.е. ещё нужны условия: граничит с восклицательным знаком, когда слово идёт сначала, когда заканчивается на цифру (или скорее всего не на букву)

 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 31.7.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
не всегда

Причем далеко не всегда. И сильно зависит от многих факторов.
В свое время пришлось на этом деле @ схомячить.

Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
мы всегда будем проходить все n итерации (n-количество элементов в массиве для замены), что в худшем случае (ни одного вхождения искомого ключа в строку) все n раз заставит сработать preg_replace в холостую. 

Использование модификатора "e" очень частая ошибка многих пхпшников, которые наивно думают, что чем код короче, тем он быстрее smile
"e"незаменим, когда надо в заменяющую функцию передать НЕСКОЛЬКО параметров, часть из которых не из карманов. При работе с BB кодами e незаменим. Там уж никак.


Цитата(Gold Dragon @  31.7.2006,  18:12 Найти цитируемый пост)
щё нужны условия: граничит с восклицательным знаком, когда слово идёт сначала, когда заканчивается на цифру (или скорее всего не на букву)


Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
И [\s.-=;] все же не все элементы включены (таб, запятая, восклицательный знак, двоеточие и т.д.),


Цитата(GiV @  31.7.2006,  17:05 Найти цитируемый пост)
класс [^А-Яа-яA-Za-z] все же лучше. 

Тут есть два момента. Первый - кирилица. Бывает глюит, надо локаль включать обязательно через set_locate().
Второй момент, все-таки помнтся мне, что был квантофикатор \b или \B, \W тут не подойдет.

И еще. [^А-Яа-яA-Za-z] все-таки большое-колво символов, а перечислив спецсимволы, как это сделал я, мы по логике получим в паттерне меньшее число проверок при компиляции, т.е. как мне кажется, указать все нужные спецсиволы будет лучше. 
PM ICQ   Вверх
GiV
Дата 31.7.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Цитата(Mal Hack @  31.7.2006,  18:58 Найти цитируемый пост)
Второй момент, все-таки помнтся мне, что был квантофикатор \b или \B, \W тут не подойдет.

Границы слова. Они тоже зависят от локали, так как определение идет фактически на таких раздельных регулярках ^\w, \w$, \w\W, \W\w, а \w и \W включают различные наборы символов (коды символов не только до 128, но и больше)


Цитата(Mal Hack @  31.7.2006,  18:58 Найти цитируемый пост)
И еще. [^А-Яа-яA-Za-z] все-таки большое-колво символов, а перечислив спецсимволы, как это сделал я, мы по логике получим в паттерне меньшее число проверок при компиляции, т.е. как мне кажется, указать все нужные спецсиволы будет лучше.

Ну в детали внутренней работы PCRE не вникал, так что пытаться что-либо доказать не буду. Я там не был, врать не стану. Можно попробовать попрофилировать код разных регулярок на одном и том же тектовом наборе, хотя это все частные случаи. 
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 24.4.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



так.. вопрос опять всплыл, но сейчас чуть всё проще, нужно тупо заменять слова. Просто не хочу сильно вымудряться. В общем есть массив со словами
Код

$filtr = array(
    'aaa',
    'bbb',
    'ccc',
    'ddd'
);

обработка простая
Код

function filtr($str){
    GLOBAL $filtr;
    $str = str_replace($filtr, '...', $str);
    return $str;
}

но как мне сделать чтоб слова сравнивались без учёта регистра, чтоб не писать
Код

$filtr = array(
    'aaa',
    'AaA',
    'AAA',
    'Aaa'
);

я пытался сделать
Код

$a1 = str_replace($filtr, '...', strtolower($str));
$a2 = strtolower($str);
$a3 = str_replace($filtr, '...', $str);
и сравнивать их, но запутался в логике :)


Что подскажите?



Это сообщение отредактировал(а) Gold Dragon - 24.4.2007, 12:38


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
xolod
Дата 24.4.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

Репутация: 3
Всего: 13



Код

// Регистро-независимый вариант функции str_replace()
str_ireplace

PM MAIL   Вверх
Gold Dragon
Дата 24.4.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



О как??? А я и не знал....
А синтаксис у неё такой же?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.