Форумы Форум www.proxomitron.ru
Все о программе Proxomitron
Главная  • FAQ для форума  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Личные сообщения  •  Вход
 Неопределённый артикль, или шутка черного йумора
 Сайт -> Форумы » Фильтры
Следующая тема
Предыдущая тема

Новая тема  Ответить
Автор Сообщение
Matthew
Junior Member
Junior Member


Зарегистрирован: 10.06.2004
Сообщения: 34

СообщениеДобавлено: Сб, Авг 29 2015 16:20 Цитировать |  |  | 

Всем привет Mr. Green
Создаю фильтр:
Цитата:
[Patterns]
Name = "Indefinite article RU [Matthew]"
Active = FALSE
Limit = 16
Match = "(и, |а, |е, )\1"
Replace = "\1 бля, "

И он прекрасно работает, как и его англоязычный аналог:
Цитата:
[Patterns]
Name = "Indefinite article EN [Matthew]"
Active = FALSE
Limit = 16
Match = "(ing, |s, )\1"
Replace = "\1 fucking, "

Но при попытке объединить эти фильтры в один,объединённый фильтр не работает:
Цитата:
[Patterns]
Name = "Indefinite article INT [Matthew]"
Active = TRUE
Limit = 16
Match = "(и, |а, |е, )\1"
"(ing, |s, )\2"
Replace = "\1 бля, "
"\2 fucking, "

В чём моя ошибка Question Exclamation

P.S. Кстати, очень интересно выглядят странички после работы упрощенного фильтра:
Цитата:
[Patterns]
Name = "Indefinite article TS [Matthew]"
Active = FALSE
Limit = 16
Match = ", \1"
Replace = "\1 бля, "

Вставленный артикль, часто оказывается в середине слов, разрывая их на части. Интересно из-за чего так Confused

P.P.S. Русскоязычная версия не упрощенного фильтра работает только в русифицированном проксе, и то не на каждой исходной кодировке. Впрочем, последнее только в плюс, а то у разыгрываемого чела возникнет вопрос, а чего это ВЕСЬ интернет поменялся?!
К началу Профиль Сообщение
chAlx
Moderator
Moderator


Зарегистрирован: 30.06.2004
Сообщения: 2621
Откуда: SPb

СообщениеДобавлено: Вс, Авг 30 2015 17:17 Цитировать |  |  | 

Для решения этой актуальной и своевременной задачи надо понимать, как работает сравнение. А работает оно, посимвольно сопоставляя текущий фрагмент исходного кода с каждым фильтром (игнорируя пробелы, переносы строк, регистр латинских букв и т.п.) Т.о. второй фильтр пытается найти строку, в которой последовательно встречаются окончание русского слова и, сразу за ним, английское окончание. В существующем вебе это большая редкость.

Чтобы в одном фильтре искать разные строки и заменять на разное, можно использовать $SET(). Чтобы искать кириллицу, нужно учитывать все кодировки и регистры.
К началу Профиль Сообщение
Matthew
Junior Member
Junior Member


Зарегистрирован: 10.06.2004
Сообщения: 34

СообщениеДобавлено: Вс, Окт 11 2015 07:05 Цитировать |  |  | 

chAlx писал(а):
Чтобы в одном фильтре искать разные строки и заменять на разное, можно использовать $SET()
chAlx, а можешь пример привести, взяв за основу объединённый фильтр?
К началу Профиль Сообщение
chAlx
Moderator
Moderator


Зарегистрирован: 30.06.2004
Сообщения: 2621
Откуда: SPb

СообщениеДобавлено: Пн, Окт 12 2015 14:33 Цитировать |  |  | 

Matthew:

Вот пример рабочего (и полезного;) фильтра, использующего поиск-замену по нескольким строкам (из блоклиста):

http://proxomitron.ru/board/viewtopic.php?t=787&start=20#6652

Его, конечно, можно существенно упростить. Там в самом фильтре две основных конструкции: $LST() для вызова сравнения строк в том месте, где это нужно, и $TST((\0)) для сравнения текущего контекста с тем, что установлено в \0. Если вторая (зависимая) часть нужна не для второго поиска по ней, а для замены на неё, то можно использовать просто \0 в блоке Replace. (Есть ещё $GET(), но он, если я правильно помню, тут не нужен.)

Вот ещё похожий фильтр, как раз про условную замену. Но там в топике нет собственно блоклиста, только примеры и общий синтаксис:

http://proxomitron.ru/board/viewtopic.php?t=1325
К началу Профиль Сообщение
Гость






СообщениеДобавлено: Сб, Дек 26 2015 06:49 Цитировать |  |  | 

"(и, |а, |е, )\1"
если речь об окончание русских слов, то

[А-я] - вся кириллица от А заглавной до я "маленькой"
и получаем
([А-я]++(и|а|е)\1, )\2&$SET(0=бля) - любые буквы кириллицы до (и или а или е) и запятой с пробелом, а если такое найдено, то присваиваем переменной 0 значение "бля"
([A-z]++(ing|s)\1, )\2&$SET(0=fucking) - англ вариант

(переменная \1 чисто информативная, для тестирования, в реальности не нужна)

криво, но можно объединить в один фильтр

(([А-я]++(и|а|е)\1, )\2&$SET(0=бля))|(([A-z]++(ing|s)\1, )\2&$SET(0=fucking))
в замене:
\2 \0
К началу
Показать сообщения:      
 
Новая тема  Ответить

 Перейти:   




Следующая тема
Предыдущая тема
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


P o w e r e d b y p h p B B © p h p B B G r o u p :: T h e m e b a s e d o n FI T h e m e :: Часовой пояс: GMT + 3