Версия для печати темы
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
Спасибо большое
Автор: Setuper 20.9.2010, 20:54
Лучше же конечно записать это выражение через одну функцию замены, дабы два раза не пробегать по строке.
Код
zamena = data:gsub("[<>]", function(k) return k == "<" and "<" or ">" 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'>")
Автор: 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, я просто привел код из очень старого скрипта, для наглядности. Тебе за метод спасибо, сам теперь только им и пользуюсь, тем более я упомянул про него в своем сообщении
foXDEvil, давай сюда код свой, без этого никак.
Автор: foXDEvil 21.9.2010, 12:19
Сразу предупреждаю программист из меня ещё тот так что в скрипте вы найдёте кучу и тучу ошибок хД
(скрипт выводит последние 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
переделал из истории на верлике
Автор: 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'>")
попробовать вот такой код:
* надо удалить!
всё отлично работает
кроме zamena = string.gsub(zamena, "%$%-\\", "<img src='dckolobok/beee.bmp.png'>") не видит его
думаю сам утрясу !!!
Всем спасибо за потраченное время!!
Автор: 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
именно этого мне не хватало как обидно что мне мозгов не хватает ((((
Автор: Saymon 4.10.2010, 11:05
нет