Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Программирование на Lua _ string.gsub

Автор: foXDEvil 20.9.2010, 20:03

Ранее такого не делал и возникли проблемы.
У меня лог чата создаётся в формате html и всё это дело идёт на сайт.
Так вот в целом то работает, но почему та он хочет использовать string.gsub тольк один раз.

Код
        zamena = (string.gsub(data, "<", "<"))
        zamena = (string.gsub(data, ">", ">"))
        AddMessage("<font face=MS Sans Serif>["..nowdate.."] "..nick1.." "..zamena.."</font></i></br>")




В данном примере работает строка с >. Помогите и объясните плиз!!!
Ещё пробовал делать так
Код
zamena = (string.gsub(data, "<", "<")) and (string.gsub(data, ">", ">"))

Автор: alex82 20.9.2010, 20:08

Наверное, в качестве аргумента при втором вызове нужно указывать zamena, а не data.

А еще лучше так:

Код
       zamena = data:gsub("<", "<"):gsub( ">", ">")

Автор: foXDEvil 20.9.2010, 20:46

Спасибо большое big_smile.gif

Автор: Setuper 20.9.2010, 20:54

Лучше же конечно записать это выражение через одну функцию замены, дабы два раза не пробегать по строке.

Код
zamena = data:gsub("[<>]", function(k) return k == "<" and "&lt;" or "&gt;" end)

Автор: Ksan 20.9.2010, 23:16

Объясните мне, в чём смысл замены одного символа тем же самым символом?

Код
(string.gsub(data, "<", "<"))
Покажите мне хотя бы одно различие между ними.

Автор: Alexey 21.9.2010, 5:05

Не одним и тем-же, а его хтмль-кодом, который форум перевёл обратно в символ – посмотри скриншот из первого поста.

Автор: foXDEvil 21.9.2010, 11:40

Код
gsub( "8-\", "<img src='dckolobok/blush2.bmp.png'>"):gsub( "%-\", "<img src='dckolobok/wacko.bmp.png'>"):gsub( "$-\", "<img src='dckolobok/beee.bmp.png'>"):gsub( "{:-\", "<img src='dckolobok/unsure.bmp.png'>")


пробовал подставлять слеш \ вроде нотепад показывает норм но хаб выдаёт ошибку(
Всё дело в смайликах у них символы проблемные >.<

Автор: Nickolya 21.9.2010, 12:00

Итак, для начала, я думаю, тебе надо прочитать http://mydc.ru/topic266.html. Затем могу предложить такой костыль, который я как-то сделал для скрипта http://mydc.ru/topic1901.html:

Код
tMagic = {
    ["%^"] = "%%%^",
    ["%["] = "%%%[",
    ["%)"] = "%%%)",
    ["%("] = "%%%(",
    ["%+"] = "%%%+",
    ["%*"] = "%%%*",
    ["%$"] = "%%%$",
    ["%?"] = "%%%?",
    ["%."] = "%%%.",
    ["%-"] = "%%%-",
}

function MakeNormMagicCharacters(sData)
    local sData = string.gsub(sData, "%%", "%%%%")
    for sFrom, sTo in pairs(tMagic) do
        sData = string.gsub(sData, sFrom, sTo)
    end
    return sData
end

Применение в твоем случчае:
Код
gsub( MakeNormMagicCharacters("8-\\"), "<img src='dckolobok/blush2.bmp.png'>"):gsub( MakeNormMagicCharacters("%-\\"), "<img src='dckolobok/wacko.bmp.png'>"):gsub( MakeNormMagicCharacters("$-\\"), "<img src='dckolobok/beee.bmp.png'>"):gsub( MakeNormMagicCharacters("{:-\\"), "<img src='dckolobok/unsure.bmp.png'>")


Для справки: в луа символ \ является служебным и для его нормального использования надо писать \\
Двойная кавычка экранируется как \"

Либо еще можно использовать http://mydc.ru/ipb.html?showtopic=334&view=findpost&p=30147, он оптимальнее.

Но лучше изучить просто какие символы экранируются и записывать вообще вот так:
Код
gsub( "8%-\\", "<img src='dckolobok/blush2.bmp.png'>"):gsub( "%%%-\\", "<img src='dckolobok/wacko.bmp.png'>"):gsub( "%$%-\\", "<img src='dckolobok/beee.bmp.png'>"):gsub( "{:%-\\", "<img src='dckolobok/unsure.bmp.png'>")

Автор: foXDEvil 21.9.2010, 12:04

Огромное спасибо big_smile.gif классный форум с классными админами big_smile.gif не заставляют долго ждать big_smile.gif)))

Автор: alex82 21.9.2010, 12:07

Nickolya

Код
tMagic = {
    ["%^"] = "%%%^",
    ["%["] = "%%%[",
    ["%)"] = "%%%)",
    ["%("] = "%%%(",
    ["%+"] = "%%%+",
    ["%*"] = "%%%*",
    ["%$"] = "%%%$",
    ["%?"] = "%%%?",
    ["%."] = "%%%.",
    ["%-"] = "%%%-",
}

function MakeNormMagicCharacters(sData)
    local sData = string.gsub(sData, "%%", "%%%%")
    for sFrom, sTo in pairs(tMagic) do
        sData = string.gsub(sData, sFrom, sTo)
    end
    return sData
end
Вся эта лабуда делается при помощи одного метода:
Код
:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%1")

Об этом я уже писал http://mydc.ru/index.html?showtopic=334&view=findpost&p=30147.

Автор: foXDEvil 21.9.2010, 12:11

увы но даже с функцией обработать в смайлик отказывается(((

Автор: Nickolya 21.9.2010, 12:15

alex82, я просто привел код из очень старого скрипта, для наглядности. Тебе за метод спасибо, сам теперь только им и пользуюсь, тем более я упомянул про него в своем сообщении big_smile.gif

foXDEvil, давай сюда код свой, без этого никак.

Автор: foXDEvil 21.9.2010, 12:19

laughing.gif Сразу предупреждаю программист из меня ещё тот так что в скрипте вы найдёте кучу и тучу ошибок хД
(скрипт выводит последние 35 сообщений из чата в файлик)

Раскрывающийся текст
Код
LastTenMessages = {}
NumberOfMessages = 0
botname = "R[Bot]"
logfile= "/home/madnesss/hosts/toa/verlilog/35.html?#34;
tMagic = {
    ["%^"] = "%%%^",
    ["%["] = "%%%[",
    ["%)"] = "%%%)",
    ["%("] = "%%%(",
    ["%+"] = "%%%+",
    ["%*"] = "%%%*",
    ["%$"] = "%%%$",
    ["%?"] = "%%%?",
    ["%."] = "%%%.",
    ["%-"] = "%%%-",
}

function MakeNormMagicCharacters(sData)
    local sData = string.gsub(sData, "%%", "%%%%")
    for sFrom, sTo in pairs(tMagic) do
        sData = string.gsub(sData, sFrom, sTo)
    end
    return sData
end

function VH_OnParsedMsgChat(nick, data)
    if (string.find(data, "^[%.%+!]")) then
    else
        nick1 = "<<b>"..nick.."</b>>"
        nick2 = "<b>*"..nick.."</b>"
        nowdate = os.date("%X")
        zamena = data:gsub("<", "<"):gsub( ">", ">"):gsub( "/me", ""):gsub( "8%-\\", "<img src='dckolobok/blush2.bmp.png'>"):gsub( "%%%-\\", "<img src='dckolobok/wacko.bmp.png'>"):gsub( "%$%-\\", "<img src='dckolobok/beee.bmp.png'>"):gsub( "{:%-\\", "<img src='dckolobok/unsure.bmp.png'>")
        if (string.find(data, "/me")) then
        AddMessage("<font face=MS Sans Serif>["..nowdate.."] "..nick2.." "..zamena.." </font></i></br>")
        else
        AddMessage("<font face=MS Sans Serif>["..nowdate.."] "..nick1.." "..zamena.." </font></i></br>")
        end
    end
handle =  io.open(logfile,"w+")
io.output(handle)
if (handle) then
date =  os.date ("*t")
io.write("<link rel='stylesheet' href='/templates/system/css/system.css' type='text/css' /><link rel='stylesheet' href='/templates/siteground-j15-154/css/template.css' type='text/css' /><style type'text/css'>body {font-family: Tahoma, Verdana, Arial, sans-serif; line-height: 1.3em;    margin: 0;    padding: 0;    font-size: 11px; color: #424242;    background: #efeeee;}</style>")
io.write(string.format("")..GetMessages())
io.flush()
end
    return 1
end

function AddMessage(message)
    if (NumberOfMessages == 0) then
        LastTenMessages[1] = message
        NumberOfMessages = 1
    elseif (NumberOfMessages < 35) then
        NumberOfMessages = NumberOfMessages + 1
        LastTenMessages[NumberOfMessages] = message
    elseif (NumberOfMessages == 35) then
         for i = 1, 34, 1 do
            LastTenMessages[i] = LastTenMessages[i+1]
        end
        LastTenMessages[35] = message
    end
end

function GetMessages()
    if (NumberOfMessages == 0) then
        return ""
    else
        TempString = ""
        for i = 1, NumberOfMessages, 1 do
            TempString = TempString.."   "..LastTenMessages[i]
        end
        return TempString
    end
end

переделал из истории на верлике big_smile.gif

 35web.lua ( 2.36 килобайт ) : 3
 

Автор: alex82 21.9.2010, 12:24

Функция обработки смайлов из StatPX:

Код
tSmiles = {
    ["biggrin.gif"] = {":D", ":-D", ":=D"},
    ["blink.gif"] = {"oO", "o.O", "o_O", "оО", "о.О", "о_О"},
    ["confused.gif"] = {":S", ":-S", ":=S", ":confused:"},
    ["cry.gif"] = {":'(", ":'-(", ":'=(", ":cry:"},
    ["lol.gif"] = {":lol:", ":LOL:", "LOL"},
    ["sad.gif"] = {":(", ":-(", ":=("},
    ["shock.gif"] = {"O.O", "O_O", "О.О", "О_О", ":shock:"},
    ["smiley.gif"] = {":)", ":-)", ":=)"},
    ["tongue.gif"] = {":P", ":-P", ":=P"},
    ["wink.gif"] = {";)", ";-)", ";=)"},
    ["woohoo.gif"] = {"8-D", "8=D", ":woohoo:"},
}

function string.Smiles(str)
    for i,v in pairs(tSmiles) do
        local rep = "<img src=\"smiles/"..i.."\" border=\"0\" alt=\"%1\" />"
        for _,smile in ipairs(v) do
            str = str:gsub(smile:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%1"),rep)
        end
    end
    return str
end

Используется так:
Код
src=src:Smiles()


PS. Изобретать велосипед - на редкость неблагодарное занятие.

Автор: Nickolya 21.9.2010, 12:32

Ввиду некой тупости верли (с которой как-то пришлось встретиться) предлагаю вместо

Код
        zamena = data:gsub("<", "<"):gsub( ">", ">"):gsub( "/me", ""):gsub( "8%-\\", "<img src='dckolobok/blush2.bmp.png'>"):gsub( "%%%-\\", "<img src='dckolobok/wacko.bmp.png'>"):gsub( "%$%-\\", "<img src='dckolobok/beee.bmp.png'>"):gsub( "{:%-\\", "<img src='dckolobok/unsure.bmp.png'>")

попробовать вот такой код:
Цитата
local zamena = data
zamena = string.gsub(zamena, "<", "&*#60;")
zamena = string.gsub(zamena, ">", "&*#62;")
zamena = string.gsub(zamena, "/me", "")
zamena = string.gsub(zamena, "8%-\\", "<img src='dckolobok/blush2.bmp.png'>")
zamena = string.gsub(zamena, "%%%-\\", "<img src='dckolobok/wacko.bmp.png'>")
zamena = string.gsub(zamena, "%$%-\\", "<img src='dckolobok/beee.bmp.png'>")
zamena = string.gsub(zamena, "{:%-\\", "<img src='dckolobok/unsure.bmp.png'>")

* надо удалить!

Автор: foXDEvil 21.9.2010, 12:45

Цитата(Nickolya @ 21.9.2010, 14:32) *
Ввиду некой тупости верли (с которой как-то пришлось встретиться) предлагаю вместо
Код
        zamena = data:gsub("<", "<"):gsub( ">", ">"):gsub( "/me", ""):gsub( "8%-\\", "<img src='dckolobok/blush2.bmp.png'>"):gsub( "%%%-\\", "<img src='dckolobok/wacko.bmp.png'>"):gsub( "%$%-\\", "<img src='dckolobok/beee.bmp.png'>"):gsub( "{:%-\\", "<img src='dckolobok/unsure.bmp.png'>")

попробовать вот такой код:

* надо удалить!


всё отлично работает big_smile.gif кроме zamena = string.gsub(zamena, "%$%-\\", "<img src='dckolobok/beee.bmp.png'>") не видит его big_smile.gif думаю сам утрясу !!!
Всем спасибо за потраченное время!! big_smile.gif

Автор: Nickolya 21.9.2010, 13:23

А попробуй после

Код
        local zamena = data
Дописать
Цитата
zamena = string.gsub(zamena, "&*#36;", "$")
zamena = string.gsub(zamena, "&*#124;", "|")

*, как и обычно, надо удалить!

Автор: foXDEvil 21.9.2010, 13:32

именно этого мне не хватало big_smile.gif как обидно что мне мозгов не хватает ((((

Автор: foXDEvil 4.10.2010, 11:03

Не хотел флудить создавая новую тему big_smile.gif Мне интересно можно ли через меню хаба открыть веб ссылку? Не важно птоха или верлик. Т.е. заходишь на хаб в меню нажимаешь Регистраия и тебя кидает на сайт с формой для регистрации big_smile.gif Если такое возможно киньте код big_smile.gif Заранее спасибо!

Автор: Saymon 4.10.2010, 11:05

нет