![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
Допустим есть гостевая книга. Сообщения оставляются без предварительной модерации. Есть список слов (мат и т.п.) которые нужно находить в сообщении и заменять
Вопрос: - как грамотнее организовать проверку и замену? И главное, какие функции быстреке будут работать? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Зависит от кол-ва слов и сложности правил...
В принципе и preg-replace() - 1 раз можно прогнать. |
|||
|
||||
| AztEK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 723 Регистрация: 4.1.2005 Репутация: нет Всего: 18 |
А в идеале ещё и заменять слова, где скажем вместо русских букв используются латинские со схожим написанием.
Тут, наверное, стоит все схожие символы ложить в массив и прегать по массиву. Правда не знаю насчёт скорости... -------------------- Linux is like wigwam -- no windows, no gates, apache inside. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
Mal Hack
почитал документацию и не совсем понял как это использовать вот например нужно в сообщении делать следующие замещения - aaa на ббб - 1234 на 4321 - ёй на юй а код типа такого
так чтоли? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| AntonioBanderaz |
|
|||
![]() Velichko Anton ![]() ![]() Профиль Группа: Участник Сообщений: 851 Регистрация: 28.4.2005 Где: Санкт-Петербург Репутация: нет Всего: 18 |
-------------------- ГЫ... |
|||
|
||||
| BIG BROTHER |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 200 Регистрация: 9.12.2004 Где: Россия, Москва Репутация: 1 Всего: 4 |
быстрее всего будет работать str_replace (т.е. обычная замена без регулярных выражений)
НО правильней ИМХО делать так: в базе хранить корни слов - матов и смотреть в тексте именно эти корни. При нахождении корня заменять все слово в котором этот корень есть (т.е. от пробела до пробела) Но конечно на 100 уберечся нельзя например вот 2 слова: хорошо и xopoшo - визуально разницы вообще никакой а во втором слове буквы Х О и P- латинские икс, о и пе. да и после каждой буквы пробелов могут понаставить. В идеале конечно нужно все жестко модерировать и карать карой небесной нарушителей Это сообщение отредактировал(а) BIG BROTHER - 30.1.2006, 17:20 --------------------
Mess with the best, die like the rest |
|||
|
||||
| AztEK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 723 Регистрация: 4.1.2005 Репутация: нет Всего: 18 |
BIG BROTHER корни - не дело. Будет резать безобидные слова типа "застрахуйте"
-------------------- Linux is like wigwam -- no windows, no gates, apache inside. |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Gold Dragon, если так, то:
Если 5 юзаешь, то str_ireplace |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
BIG BROTHER
наверное всё таки нужна регулярка, т.к. в базе лежат слова, а их надо проверять на наличие не алфавитного знака в начале и в конце. Например, слово "устой" не должно попасть в "плохие" слова по маске "сто", а ".сто" должно попасть. Как мне это сделать регулярными выражениями? Всем спасибо за пояснение к str_replace. Но как мне совместить это с базой? Или проще это хранить в переменной(Array) в каком-нибудь "языковом" файле? Если в базе, то наверное нужно будет всё равно в массив перегонять? BIG BROTHER само сабой, нет 100% защиты и нужна модерация, но я же не могу модерить постоянно online, вот и нужна какая-то элементарная защита пока модератор кушает пончики Добавлено @ 11:07 я юзаю 5-ку -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| BIG BROTHER |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 200 Регистрация: 9.12.2004 Где: Россия, Москва Репутация: 1 Всего: 4 |
Из базы не сложно перегнать в массив и прогнать str_replace и заменять на что-то вроде [censored]
--------------------
Mess with the best, die like the rest |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
BIG BROTHER
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Gold Dragon
|
|||
|
||||
| PARROT |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2339 Регистрация: 5.1.2005 Где: Спб-ЦарьГрад Репутация: нет Всего: 50 |
Жизнь заставила сделать фильтр слов:
В текстовом файле записаны слова: mate.txt
Делаю так:
Результат:
Получается, что он слово находит, но заменяет только первые три буквы. Как исправить? -------------------- Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим! |
||||||
|
|||||||
| Serkys |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1061 Регистрация: 19.4.2004 Репутация: 2 Всего: 22 |
PARROT, а откуда у тебя берётся $mas_com?
|
|||
|
||||
| PARROT |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2339 Регистрация: 5.1.2005 Где: Спб-ЦарьГрад Репутация: нет Всего: 50 |
Из базы. В базу пишется текст сообщения, в котором могут содержаться такие слова.
Потом при выводе нужно все это заменить. -------------------- Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
А если так:
|
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 2 Всего: 73 |
Mal Hack, ммм... а в файле ж слова разделенные переносом строк...
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Ах, ну да... Сорри, стормозил... Я бы тут альтернативной регуляркой прошолся бы.
|
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 2 Всего: 73 |
Mal Hack, да уж пробовали - regular expression too long
Добавлено @ 16:59 Предпологаю что на сервере все прекрасно заработает. У меня во всяком случае проблем не возникло. -------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Надо бы вывести через print_r массив полученных слов и посмотреть. Вероятно он битый..
|
|||
|
||||
| PARROT |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2339 Регистрация: 5.1.2005 Где: Спб-ЦарьГрад Репутация: нет Всего: 50 |
Странно, действительно на сервере все заработало: http://pk.traktora.spb.ru/index.php?page=comment&idp=98
(Меня Денвер начинает раздражать..., второй баг уже) -------------------- Безумный утешается прошедшим, слабоумный - будущим, умный - настоящим! |
|||
|
||||
| Asbestos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 30.6.2006 Репутация: нет Всего: нет |
Леди и мужики, ситуация следующая: замену в строках произвожу str_ireplace, НО это отказывается воспринимать верхний регистр кириллицы
хехе прошу прощения, забыл указать верную локаль Это сообщение отредактировал(а) Asbestos - 30.6.2006, 07:48 |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 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" -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
А что ты хочешь сделать?
Покажи код. |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
Mal Hack, я твой пытался запустить
Добавлено @ 17:14 а так как я в регах ничего не понимаю, так и не разобрался... там явно не хватает $b -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
А тут ты так не сделаешь. Тут надо через preg_replace_callback
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
Mal Hack, ну тебе виднее, а через preg_replace_callback как ?
просто через str_replace работает не так. он заменяет внутри слова -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Gold Dragon, поверь, я давно понял почему тебя str_replace не устраивает
|
|||
|
||||
| Gold Dragon |
|
||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
совсем запутался
нужно это
Mal Hack, зачем мне проверять слова на которые я меняю, ведь это мои слова замены, а не пользовательские? зы вот тестовая строка
-------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||
|
|||||||
| GiV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 13.7.2006 Где: rus|53 Репутация: 2 Всего: 9 |
Должно было работать и без функции replace ($str = preg_replace("/([^a-z])" . $a[ $i ] . "([^a-z])/is", "\\1" . $b[ $i ] . "\\2", $str);), соединяющей куски, но на двух серверах странное поведение было. |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Плохое решение. ЛУчше 1 раз пройтись большой регуляркой, чем много маленькими.
Хотя и не всегда. Да и замудренно как-то это. Плюс, модификатор e сильно кушает память и может вызвать неприятности. Плюс, помним, что ьез установки локали RegEX не будет работать с кирилицей в паттерне.
|
|||
|
||||
| GiV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 13.7.2006 Где: rus|53 Репутация: 2 Всего: 9 |
не всегда, хотя в данном случае правда Ваша. preg_replace с модификатором e работает медленне replace_callback + мы всегда будем проходить все n итерации (n-количество элементов в массиве для замены), что в худшем случае (ни одного вхождения искомого ключа в строку) все n раз заставит сработать preg_replace в холостую. В то время как большой прег выполнится только ОДИН раз, там выигрыши получаются от 2-х мс... И [\s.-=;] все же не все элементы включены (таб, запятая, восклицательный знак, двоеточие и т.д.), класс [^А-Яа-яA-Za-z] все же лучше. P.S. при достижении 100 с меня +. Это сообщение отредактировал(а) GiV - 31.7.2006, 16:27 |
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
Наверное я слишком многое хочу
Mal Hack, не все условия выполняются: замена происходит только если в начале стоит цифра, пробелы или точки, остальные не меняются... Т.е. ещё нужны условия: граничит с восклицательным знаком, когда слово идёт сначала, когда заканчивается на цифру (или скорее всего не на букву) -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
| Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 16 Всего: 261 |
Причем далеко не всегда. И сильно зависит от многих факторов. В свое время пришлось на этом деле @ схомячить. Использование модификатора "e" очень частая ошибка многих пхпшников, которые наивно думают, что чем код короче, тем он быстрее "e"незаменим, когда надо в заменяющую функцию передать НЕСКОЛЬКО параметров, часть из которых не из карманов. При работе с BB кодами e незаменим. Там уж никак.
Тут есть два момента. Первый - кирилица. Бывает глюит, надо локаль включать обязательно через set_locate(). Второй момент, все-таки помнтся мне, что был квантофикатор \b или \B, \W тут не подойдет. И еще. [^А-Яа-яA-Za-z] все-таки большое-колво символов, а перечислив спецсимволы, как это сделал я, мы по логике получим в паттерне меньшее число проверок при компиляции, т.е. как мне кажется, указать все нужные спецсиволы будет лучше. |
||||
|
|||||
| GiV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 13.7.2006 Где: rus|53 Репутация: 2 Всего: 9 |
Границы слова. Они тоже зависят от локали, так как определение идет фактически на таких раздельных регулярках ^\w, \w$, \w\W, \W\w, а \w и \W включают различные наборы символов (коды символов не только до 128, но и больше) Ну в детали внутренней работы PCRE не вникал, так что пытаться что-либо доказать не буду. Я там не был, врать не стану. Можно попробовать попрофилировать код разных регулярок на одном и том же тектовом наборе, хотя это все частные случаи. |
|||
|
||||
| Gold Dragon |
|
||||||||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
так.. вопрос опять всплыл, но сейчас чуть всё проще, нужно тупо заменять слова. Просто не хочу сильно вымудряться. В общем есть массив со словами
обработка простая
но как мне сделать чтоб слова сравнивались без учёта регистра, чтоб не писать
я пытался сделать
Что подскажите? Это сообщение отредактировал(а) Gold Dragon - 24.4.2007, 12:38 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
||||||||
|
|||||||||
| xolod |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 148 Регистрация: 24.5.2005 Где: Когда: Что: Репутация: 3 Всего: 13 |
|
|||
|
||||
| Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 1 Всего: 71 |
О как??? А я и не знал....
А синтаксис у неё такой же? -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Тексты | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |