LINUX.ORG.RU

Javascript, замена символов в строке

 ,


0

1

Здравствуйте, подскажите что я делаю не так, много чего перепробовала, но не как не получается реализовать то что я хочу.

Надо из строки

<div class="images" id="<%=i%>"><img src="<%=res[i]%>" /></div>

Получить

<div class="images" id="0"><img src="http://localhost/images/background.jpg" /></div>

Но получаю

<div class="images" id="i"><img src="res[i]" /></div>

Вот мой код

var echo = '<div class="images" id="<%=i%>"><img src="<%=res[i]%>" /></div>';
res = Array(
  'http://localhost/images/background.jpg',
  'http://localhost/images/logo.png'
);
for (var i=0; i<res.length; ++i) {
  console.log(echo.replace(/[\r\t\n]/g, " ")
    .split("<%").join("\t")
    .replace(/((^|%>)[^\t]*)'/g, "$1\r")
    .replace(/\t=(.*?)%>/g, "$1")
    .split("\t").join("');")
    .split("%>").join("p.push('")
    .split("\r").join("\\'")
  );
}


не стоит использовать регулярные выражения для таких дел.. Посмотри код JS шаблонизаторов на гитхабе, если правда хочешь по-лучше написать

zarkone ★★
()
var i;
var res = [];
var echo = '<div class="images" id="<%=i%>"><img src="<%=res[i]%>" /></div>';

i=1
res[1] = '1.gif';
console.log(echo.replace("<%=i%>", i).replace("<%=res[i]%>", res[i]));

не?

а вообще, YDIW

anTaRes ★★★★
()

res = Array(

Мусьё знает толк в извращениях.

anonymous
()

1. Взять кусок до первого процента
2. eval(кусок до второго процента)
3. Повторить 1, пока проценты не кончатся
4. Влепить остаток строки.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

А по-другому никак не сделать то, что нужно ТС.

Я уверен, что вышеупомянутые обертки в итоге eval и вызывают! Потому что как ты еще заменишь строку с именем переменной на значение этой переменной?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

как ты еще заменишь строку с именем переменной на значение этой переменной?

Посмотришь свойство с этим именем в том объекте, что биндишь к этому шаблону.

eval — зло и тормоз.

x3al ★★★★★
()

string='<div class="images" id="<%=i%>"><img src="<%=res[i]%>" /></div>'

addresses = [
   'http://localhost/images/background.jpg',
   'http://localhost/images/logo.png'
  ]


console.log(

 addresses.map(function(address, i){
   return string
    .replace(/<%=i%>/, addresses.indexOf(addresses[i]))
    .replace(/<%=res\[i\]%>/, addresses[i])
 })

)


//>>>> [ '<div class="images" id="0"><img src="http://localhost/images/background.jpg" /></div>',
//>>>>   '<div class="images" id="1"><img src="http://localhost/images/logo.png" /></div>' ]
lennykravits2015
()
Ответ на: комментарий от ioway

Но от eval - волосы на ладошках растут.

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

lennykravits2015
()
Ответ на: комментарий от lennykravits2015

поскольку эта болезнь неизбежно приводит к многочасовым мастурбациям на код.

Причем тут многочасовые мастурбации на код, если написание разбора арифметических выражений это курс школьной информатики (даже не институт)? Может профессию неправильную выбрал? Любители eval'а напоминают врачей которые анализы мочи на язык пробуют.

ioway
()
Ответ на: комментарий от ioway

Ну подрочи на школьную арифметику, сними напряжение, может успокоишься.

Может профессию неправильную выбрал?

Да-да, числодрочерство — это моя профессия. Это ты у нас инженер

Любители eval'а

нелюбители эвала просто его нихуянепонимают.

lennykravits2015
()
Ответ на: комментарий от anTaRes

Реализовала по другому, и i и img в один массив запихнула и через for in и replace все меняет как мне надо

Но тогда как такое реализовать?

var echo = '<div class="images" id="<%=i%>"><img src="<%=img%>" /><p><%=Date.now()%></p></div>';

Я имела в виду чтоб Date.now() выполнился?

jessgt
() автор топика
Ответ на: комментарий от jessgt

хз чо должно получиться, но конкретно этот кусок можно так:

<div class="gallery"></div>
var res = Array(
  'http://localhost/images/background.jpg',
  'http://localhost/images/logo.png'
);

var gallery = $('.gallery');
for (var i=0; i<res.length; ++i) {
    gallery.append('<div class="images" id="'+ i +'"><img src="'+ res[i] +'" /><p>'+ Date.now() +'</p></div>');
}
псевдокод и копипасты, но думаю смысл понятен

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

это не то что я хотела, хочу реализовать в этом шаблонизаторе

function t(s,d){ 
  for (var p in d)  
    s = s.replace(new RegExp('{'+p+'}', 'g'), d[p]); 
  return s; 
}

чтоб не только заменялись переменные из массива, но и хотела бы чтоб она и выполнить например эту команду смогла Date.now()

jessgt
() автор топика
Ответ на: комментарий от jessgt
<!--%begin gallery%-->
    <div class="images" id="<%=i%>"><img src="<%=img%>" /><p><%=date_now%></p></div>
<!--%end gallery%-->
var data = {
    gallery: [
        'http://localhost/images/background.jpg',
        'http://localhost/images/logo.png'
    ],
    ....
};
var allowed_func = {
    date_now: true,
    make_teacher_happy: true,
    got_A: false,
    ....
};
function is_func(f){if(allowed_func[f] && f=="date_now") return Date.now();...}
function parser(data,src){...}

* хаваем шаблон от <!--%begin ?%--> до <!--%end ?%-->
* соотв. получаем имя блока (cur_block='gallery',cur_blk_src='...')

    if (cur_data[cur_block] !== undefined) console.log('OK');
    else console.log('KO');

    cur_blk_src = t(cur_blk_src,d);
    parser(cur_data[cur_block],cur_blk_src);
* содержимое дальше рекурсивно парсим на предмет блоков/переменных/ф-ций
* ...
шаблонизатор должен работать как-то так (оооочень приблизительно)

anTaRes ★★★★
()
Ответ на: комментарий от static_lab

так же, там парсинг ведется с применением божественных нодовских стримов, что и предаёт ему скорости. А в андерскоре скорее всего как обычно все копируют на каждый чих, как обычно у них в либе принято :)

zarkone ★★
()
Последнее исправление: zarkone (всего исправлений: 1)
Ответ на: комментарий от jessgt

чтоб не только заменялись переменные из массива, но и хотела бы чтоб она и выполнить например эту команду смогла Date.now()

не, ну это конечно, нереально сложная задача.

bar=1
baz=2


console.log(

"<p foo='<%bar%>'><%Date.now()%></p><div bar='<%baz%>'><%new Date().getHours()%></div>"
 .replace(/<%([^%]+)%>/g, function(x,y){return eval(y)})

)

<p foo='1'>1438445897808</p><div bar='2'>19</div>

drMits
()

не как не получается

по русскому сколько в школе имеешь?

q11q11 ★★★★★
()
Ответ на: комментарий от drMits

Спасибо большое, то что нужно. Не подскажите почему все бояться этой функции eval и без нее не реализовать то что я хочу?

jessgt
() автор топика
Ответ на: комментарий от jessgt

Стырено из doT.js. Макро-шаблонизатор:

function compileTemplate(templateString)
{
    templateString = templateString
        // trim and compact
        .replace(/(^\s+|\s+$)/g, '')
        .replace(/\s+/g, ' ')
        // interpolation
        .replace(/\{\{=([\s\S]+?)\}\}/g, function(m, v) {
            return "'+(" + v + "||'')+'";
        })
        // conditional
        .replace(/\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, function(m, elif, code) {
            return elif
                ? ( code ? "';}else if(" + code + "){out+='" : "';}else{out+='" )
                : ( code ? "';if(" + code + "){out+='" : "';}out+='" );
        })
        // evaluate
        .replace(/\{\{([\s\S]+?(\}?)+)\}\}/g, function(m, code) {
            return "';" + code + "out+='";
        });

    try {
        return new Function('it', "var out='" + templateString + "';return out;");
    } catch (e) {
        return function() {
            return 'Template is not compiled';
        }
    }
}
Пример:
var imagesList =
'{{ for (var i in it) { }}\
    <div class="images" id="{{=it[i].id}}"><img src="{{=it[i].src}}"></div>\
{{ } }}';
imagesList = compileTemplate(imagesList);
console.log(imagesList([
    {id: 11, src: 'adfasdf'},
    {id: 23, src: 'dfghdfg'}
]));
И никакого «eval'а».

deep-purple ★★★★★
()
Ответ на: комментарий от jessgt

Потому что код внутри нее не оптимизируется. То же самое, в той или иной степени относится к try, Function, и некоторым другим. На самом деле, думать об этом стоит только если речь идет об очень узком месте, в большинстве случаев, это не имеет значения.

Кроме того, есть некоторые проблемы с безопасностью использования в серверном коде, но это уже больше из области легенд. Надо быть полным кретином, чтобы эвалить какие попало строки из сети.

В целом использовать eval можно и нужно, только с умом.

drMits
()
Ответ на: комментарий от drMits

Чутка послаще, т.к. евал выполнится сразу или даже много раз, а ф-ция только в момент вызова, так еще и «прекомпиляется».

deep-purple ★★★★★
()
Ответ на: комментарий от Deleted

это форк underscore?

может начинали и с форка, не знаю, но интерфейс методов совпадает

static_lab ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.