например есть строка:
привет #111# человек #011# как дела? #098# --------------- как вы уже наверное догадались, #111# #011# #098# - это смайлы, сами картинки храняться на сервере и имеют имена: 111.gif 011.gif 098.gif --------------- вопрос: каким образом используя JavaScript эти лексемы можно заменить на HTML код: <img src = 'путь/файл'> ? ? начал размышлять в сторону регулярных выражений: // патерн для смайлов ptn_s = /\#[0-9]{1,4}\#/g; // в этом массиве мы храним все смайлы из нашей строки smilesArray = data.match(ptn_s); подскажите пожайлуста, как можно закончить мысль с минимальными затратами ресурсов пользователя.. |
preg_replace есть в пхп. счас в ЖС поищу
Добавлено спустя 5 минут 45 секунд: хотя конечно такие вещи лучше делать на стороне сервера Добавлено спустя 20 минут 27 секунд: ага, есть метод replace что-то типа того: var text = "#001# #002#"; var ptn_s = /\#(\d{4})\#/; text = text.replace(ptn_s, "<img src='images/$1.gif />"; какттотак _________________ Ин дер гросен фамилие нихт клювен клац-клац |
andy ice спасибо за пример с реплейсом,
почему такие вещи лучше делать на стороне сервера ? действительно есть положительные моменты? |
на сервере ты сам себе хозяин, а на клиенте вообще ничего не можешь _________________ Ин дер гросен фамилие нихт клювен клац-клац |
andy ice писал(а): на сервере ты сам себе хозяин, а на клиенте вообще ничего не можешьполностью согласен! но ведь смайлы это же визуализация + есть однозначно, мы можем хранить на клиенте прокэшированую графику, поэтому отдавать можем ее оч. быстро, не ожидая загрузки файла еще + это экономия трафика, т.е. с сервака меньше байт идет.. *101* - 5 байтов за смайл получается... а не "<img src = 'путь/файл.gif' border=1>" поболее будет конечно javascript(a) будет больше на первых парах, но со временем должно окупиться. поправьте, если гдето ошибаюсь Последний раз редактировалось: Brain (2008.11.29 00:25.36), всего редактировалось 1 раз |
Brain писал(а): прокэшированую графикукакая разница, когда ты делаешь жаваскриптом подмену на урл ресурса или сразу в теле этот ресурс прописан? Brain писал(а): т.е. с сервака меньше байт идет.. *101* - 5 байтов за смайл получается<br class="101" /> ? _________________ Ин дер гросен фамилие нихт клювен клац-клац |
andy ice писал(а):
какая разница, когда ты делаешь жаваскриптом подмену на урл ресурса или сразу в теле этот ресурс прописан? разве ее нет? в примере не написал, видимо не совсем ясно про какой кэш идет речь... есть загрузка изображений в память: var smileImgArray = new Array(); smileImgArray["#101#"] = new Image(ширина, высота); smileImgArray["#101#"].src = "путь/файл.gif"; .... все смайлы аналогично если мы используем полный путь http://путь/файл.gif на сервере, скрипт его с сервера тянет? а это время... с джаваскриптом проще: юзаем вместо пути - smileImgArray["#101#"].src и графика береться из кэша, т.к. в теле документа графика и пути прописаны andy ice писал(а):
если ты борешься за эти N байт, что мешает написать типа... <br class="101" /> ? не совсем ясно о чем идет речь, можно по подробнее? |
Brain писал(а): графика береться из кэшабез разницы, или в теле смайлы или ты их жабой грузишь. это не контролируется программером. Brain писал(а): по подробнеев css например br {display:block; float:left; width:16px; height:16px; background-repeat:no-repeat;} .101 { background-image:url('../101.gif'); } .102 { background-image:url('../102.gif'); } .103 { background-image:url('../103.gif'); } _________________ Ин дер гросен фамилие нихт клювен клац-клац |
суть понятна,
нужно взять на вооружение пример с CSS, пригодиться пара вопросов: графика подгружается перед использованием <br class = '101'/>? <br /> - переводит строку, в данном примере тоже переводить будет? в ширь пошли это хорошо... получилось что то вроде: ptn_s = /\#[0-9]{1,4}\#/g; smilesArray = data.match(ptn_s); if (smilesArray != null) { for (var n=0; n<smilesArray.length; n++) { data = data.replace(smilesArray[n], '<img src = \'' + smilesImgArray[smilesArray[n]].src + '\' border=0>'); } } и казалось бы работает - оно вери гуд!, и ошибок вроде не выдает, но кодеры - народ пытливый дело в том что в массиве smilesArray могут быть повторяющиеся элементы, из за этого replace может повториться ненужных N раз, в зависимости от количества этих дубликатов. не подскажете как удалить повторяющиеся элементы из массива средствами JS? |
Brain писал(а): <br /> - переводит строку, в данном примере тоже переводить будет? andy ice писал(а): display:block; float:leftBrain писал(а): что то вродеНАХ!!!... простите. зачем вообще нужен match???? ВМЕСТО него используй replace, блин _________________ Ин дер гросен фамилие нихт клювен клац-клац |
andy ice писал(а): зачем нужен match? match хранит все смайлы из строки в одном массиве, без него цикл длиннее получиться, если делать цикл по всем смайлам (их > 50) твой вариант работает: andy ice писал(а):
var text = "#001# #002#"; var ptn_s = /\#(\d{4})\#/; text = text.replace(ptn_s, "<img src='images/$1.gif />"; но у меня пути в пхп переменных, а сам скрипт в js файле, т.е. он не подходит, жаль конечно.. меньше кода пробывал эту хрень($1) в функцию smilesImgArray["$1"].src засунуть, предварительно изменив паттерн на var ptn_s = /\(#\d{4}\#)/; не срастается Добавлено спустя 49 минут 32 секунды: Последний вопрос снимается, т.к. в цикле я в replace уже подставляю строку, а не регулярное выражение, а раз это не регулярка, значит замена происходит только с одним элементом - с первым, из всех одинаковых. следовательно => все выполняется ровно столько раз, сколько надо! andy ice, благодарю за содействие в решении данной проблемы. |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |