Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Вопрос gsub find gfind macth

Упомянутые в теме пользователи:

Показано с 1 по 5 из 5

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Старожил Аватар для alexdubovyck
    Регистрация
    24.04.2014
    Сообщений
    193
    Поблагодарил(а)
    178
    Получено благодарностей: 71 (сообщений: 41).
    Репутация: 71

    Вопрос gsub find gfind macth

    Вопрос не к рядовым юзерам. А по типу @Dreamlolz, и в таком духе. Мб уже и сообщество научилось юзать Lua по нормальному, хз. Не обижайтесь.

    Я бы справился и 1, но уже чёт долго туплю над этой задачей. Решил обратиться на форум. Мне Дрим часто помогал с кодом.

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

    Скрытый текст


    Вообщем лень - двигатель прогресса. Я только за =)
    К модератору претензий нет, делает это он скорей всего с помощью чат аддонов по типу Prat и т.д.

    Я естественно хочу поступить другим способом. В своем аддоне самостоятельно составлять список слов и контролировать этот процесс вручную. И не в коем случае не использовать готовые распространенные аддоны\решения.


    Итак запрос:
    Из сообщения - (Идет сбор в Гс, нид все)
    или (Продам кровь саргераса) (пРодам дс) (проДаМ гараж) хотелось бы находить и подсвечивать заранее заданное мной слово. И самое важное, зачем я и обратился сюда, игнорировать тот момент, что оно написано заборчиком\частоколом, или капсом, или какая-то буква в слове большая.


    Моё прошлое решение.
    Да, находит, да подсвечивает. Это удобно если нужно быстро что-то добавить, и не важно если пропустишь в чате сообщение с искомым, но...
    Недостаток - нужно вводить огромную базу написания только одного слова. Это тупо\долго\не правильно. Комбинаций масса.
    Хочу вбивать поиск нужных слов, только 1 раз.

    Код:
    local MyFilterAddon = CreateFrame'Frame'
    local function myChatFilter(self, event, arg1, ...)
    
    local ignorelisttext = {"гс", "ГС", "Гс", "гС", "Гробница саргераса", "Гробница Саргераса",
    "продам", "Продам", "продаМ", "прОдам", "ПРодам",
    }
    
    for i = 1, #ignorelisttext do
    if string.find(arg1, ignorelisttext[i], 1, "%uds.") then
    PlaySound(866, "Master");
    return false, gsub(arg1, ignorelisttext[i], "\124cff0070DDГС\124r"), ...
    end
    end --for
    end --end function
    
    function MyFilterAddon:PLAYER_LOGIN()
    ChatFrame_AddMessageEventFilter("CHAT_MSG_CHANNEL", myChatFilter) ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", myChatFilter)
    end
    
    MyFilterAddon:RegisterEvent'PLAYER_LOGIN' 
    
    MyFilterAddon:SetScript('OnEvent', function(self, event, ...) 
    return self[event](self, event )
    end)
    если ограничить до:
    Код:
    local ignorelisttext = {
    "гс",
    "продам",
    }
    M9iFQ5o.jpg

    Функция выше была найдена в нете, и по дефолту имела:
    Код:
    if arg1:find("green") then
    return false, gsub(arg1, "green", "blue"), ...
    end
    вместо моего корявого string.find который криво работает из-за недопонимания. Патерн не работает(

    Заменяет в чате, только для вас, слово грин на блю.

    Работа с патернами:
    Берём макрос
    Код:
    local a = string.match("string", patern)
    print(a)
    при local a = string.match("1Привет33fRrHJK", "%u")
    получаем "R" (%u - аппер кейс, большие буквы) Буква П проигнорена. Ват? Оо. Где HJK? не ретурнит их, не принтует(

    при local a = string.match("1Привет33fRr", "%l")
    получаем "f" (%l - ловер кейс, малые буквы) Все русские символы проигнорированы( и r, 2-я по счету малая тоже(

    Надеюсь запрос понятен. Разжевал как мог. Я перебрал много вариантов. Допускаю что и не match find мне нужны.

    Литература которая может понадобиться:

  2. #2
    Старожил Аватар для alexdubovyck
    Регистрация
    24.04.2014
    Сообщений
    193
    Поблагодарил(а)
    178
    Получено благодарностей: 71 (сообщений: 41).
    Репутация: 71
    Вообщем 10:36 продолжаю гуглить..
    Из нового:

    Чтобы выдавало не 1 символ ставим + плюсик

    Скрытый текст


    Код:
    • local a = string.match("1ggПрве33frGG", "%u+") GG
    • local a = string.match("1gwПрsdfве33frGG", "%l+") gw
    • local a = string.match("1gwПрsdfве33frGG", "%l+%l+%u+") frGG
    [свернуть]


    К сожалению патерны %i%l только для англ языка. Не поддерживают Русский utf-8 ascii. Пруф

    Если приравнять к lower. То уже получше. Но все равно не до конца выполняем задачу.

    Скрытый текст


    Код:
    local text = "гс"
    if string.lower(arg1):find(text) then
    return false, gsub(string.lower(arg1), text, "\124cff0070DD"..text.."\124r"), ...
    end
    
    
    local textt = "ключ"
    if string.lower(arg1):find(textt) then
    return false, gsub(string.lower(arg1), textt, "\124cffFF0023"..textt.."\124r"), ...
    end
    [свернуть]

    oGqyMm1.jpg

    Два if. Какой 1-й срабатывает, тот и красит. 2 цвета в 1-м сообщении не отображает. Только по 1-му.
    И писанина затруднена. Искать нид строчки где у тебя "text" == "слово"
    Хочется в 1-м месте задавать слова таблицей.

    Но проблема с заборчиком решена)

  3. #3
    Новичок
    Регистрация
    19.08.2018
    Сообщений
    9
    Поблагодарил(а)
    0
    Получено благодарностей: 4 (сообщений: 3).
    Репутация: 4
    ну ты нашел где создать тему
    if string.find(arg1
    смени на
    if string.find(arg1:lower()
    и записывай слова мелкими буквами

  4. #4
    Заблокирован
    Регистрация
    09.06.2016
    Адрес
    Rivne, Ukraine
    Сообщений
    908
    Поблагодарил(а)
    244
    Получено благодарностей: 412 (сообщений: 237).
    Репутация: 412
    Цитата Сообщение от alexdubovyck Посмотреть сообщение
    local ignorelisttext = {"гс", "ГС", "Гс", "гС", "Гробница саргераса", "Гробница Саргераса",
    "продам", "Продам", "продаМ", "прОдам", "ПРодам",
    }
    Можно сделать вот так local ignorelist = {"[гГ][сС]","[гГ][рР][оО][бБ][нН][иИ][цЦ][аА] и т.д.

  5. #5
    Новичок
    Регистрация
    19.08.2018
    Сообщений
    9
    Поблагодарил(а)
    0
    Получено благодарностей: 4 (сообщений: 3).
    Репутация: 4
    шаблоны %u, %l, %a, %w работают только с анг. символами.
    но можно легко сделать свой, например вместо %u - '[A-Z А-Я]', вместо %l - '[a-z а-я]'.
    ---------
    match/find/sub возвращает первый попавшийся, чтобы вернуло все нужно создавать функцию и юзать gmatch/gsub.
    ---------
    Цитата Сообщение от alexdubovyck Посмотреть сообщение
    Допускаю что и не match find мне нужны.
    можно просто перед поиском строку перевести в нижий регистр, то есть это
    PHP код:
    if string.find(arg1 
    заменить на
    PHP код:
    if string.find(arg1:lower() 
    ну и в таблицу записывать тоже, только в нижнем регистре

Похожие темы

  1. find zage ui
    от Blazylol в разделе Аддоны
    Ответов: 3
    Последнее сообщение: 01.03.2015, 18:39

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •