Автор |
Сообщение |
Matthew
Junior Member

Зарегистрирован: 10.06.2004
Сообщения: 39
|
Всем привет
Создаю фильтр:
Цитата: |
[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, " |
В чём моя ошибка
P.S. Кстати, очень интересно выглядят странички после работы упрощенного фильтра:
Цитата: |
[Patterns]
Name = "Indefinite article TS [Matthew]"
Active = FALSE
Limit = 16
Match = ", \1"
Replace = "\1 бля, " |
Вставленный артикль, часто оказывается в середине слов, разрывая их на части. Интересно из-за чего так
P.P.S. Русскоязычная версия не упрощенного фильтра работает только в русифицированном проксе, и то не на каждой исходной кодировке. Впрочем, последнее только в плюс, а то у разыгрываемого чела возникнет вопрос, а чего это ВЕСЬ интернет поменялся?!
|
|
|
К началу |
Профиль Сообщение |
 |
chAlx
Moderator

Зарегистрирован: 30.06.2004
Сообщения: 2634
Откуда: SPb
|
Для решения этой актуальной и своевременной задачи надо понимать, как работает сравнение. А работает оно, посимвольно сопоставляя текущий фрагмент исходного кода с каждым фильтром (игнорируя пробелы, переносы строк, регистр латинских букв и т.п.) Т.о. второй фильтр пытается найти строку, в которой последовательно встречаются окончание русского слова и, сразу за ним, английское окончание. В существующем вебе это большая редкость.
Чтобы в одном фильтре искать разные строки и заменять на разное, можно использовать $SET(). Чтобы искать кириллицу, нужно учитывать все кодировки и регистры.
|
|
|
К началу |
Профиль Сообщение |
 |
Matthew
Junior Member

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

Зарегистрирован: 30.06.2004
Сообщения: 2634
Откуда: SPb
|
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
|
|
|
К началу |
Профиль Сообщение |
 |
Гость
|
"(и, |а, |е, )\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
|