# а вы говорите индусы...
От: мыщъх США http://nezumi-lab.org
Дата: 11.05.10 19:12
Оценка: 6 (2) +2 -1 :))
Дано: толковый паренек, только что закончивший вуз и неплохо разбирающиеся в ассемблере, плюсах, скриптовых языках и всякой прочей околбасице. энергичный, обучаемый. Но ленивый до ужаса...

Задание: написать на JavaScript функцию, которая принимает на грудь HTML, находит Java Script'ы (грубо говоря, все что между script и /script), собирает их в кучу и делает eval(). Постановка задачи исходила от манагера, который до того никогда скрипты не курил, жабу не знал, но за часик с небольшим лазанья по иннету накорябал довольно шустро работающий скрипт (обрабатывающий 90% ситуаций), а так же набросал несколько тестовых примеров для его проверки. Скрипт был послан не в качестве образца для подражания, а скорее как разверзнутое ТЗ, чтобы не писать много слов на бумаге.

Исходный магеровский скрипт. Тупой до безобразия:


function grab_js(html)
{ 
    // html = unescape(html);

    var js = ""; var x = 0; var y = 0; var z = 0;
    
    for(;;)
    { 
        x = html.search(/<script/i); if (x == -1) break;

        y = html.substring(x).search(/>/); if (y == -1) break;

        z = html.substring(x + y).search(/<\/script *>/i); // might be eol as well

        if (z == -1) break; // z = len of substring(x+y)

        // grab js
        js = js + html.substring(x + y + 1, x + y + z) + ";";

        // grab next js
        html = html.substring(x + y + z + 1);
    }
    return js;
}



на следующие сутки московский паренек (и совсем не индус) показывает манагеру это.


function AnalyzeHtml(strSource)
{
var myregexp = "<script[^>]*>(.|\W)*?<\/script>"
var match = myregexp.exec(strSource);
while (match != null)
{
alert(match);
// matched text: match[0]
// match start: match.index
// capturing group n: match[n]
match = myregexp.exec();
}
}



это не только не работает, но даже не компилируется. В смысле Java Script машина давится, с воплем об ошибке:

reg:4: TypeError: Object <script[^>]*>(.|W)*?</script> has no method 'exec'
var match = myregexp.exec(strSource);

и даже после правки ошибки (правка ошибок — это такая манагеровская работа, ага?) не совсем понятно как ему предполагается работать. Паренек тем временем осознает, что накосячил и посылает еще одну итерацию:


function AnalyzeHtml(strSource)
{
var myregexp = "(?i)<script[^>]*>(.|\W)*?<\/script\W*>";
var match = myregexp.exec(strSource);
while (match != null)
{
alert(match);
 matched text: match[0]
 match start: match.index
 capturing group n: match[n]
match = myregexp.exec();
}
}



ага, уже появился поиск без учета регистра (впрочем, неработающий), однако, по прежнему возвращается (в возвращается оно через alert — это новый русский способ возврата данных из функции) у нас в руках будут скриптовые теги, которыми подавится eval().

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


function AnalyzeHtml(strSource)
{
var myregexp = /<script[^>]*>(.|\W)*?<\/script\W*>/ig;
var match = myregexp.exec(strSource);
var cnt = 0;
while (match != null)
{
var str = String(match);
var result = str.replace(/<\/?[a-z][a-z0-9]*[^<>]*>|<!--|-->/ig,"");
alert(result);
match = myregexp.exec();
cnt++;
}
}



ага, ну тут уже все почти подправлено, только... скриптовые теги убивабтся через replace (и зачем?). но склейка множественных скриптов по прежнему не работает и главное как оно все криво и тормозно.

Для справки. Человеку предложили $2k/месяц. Удаленно. Причем стартово. А дальше -- как себя покажет. Человек разочаровался ужасно. Ожидал большего. А вы говорите индуский код, индуский код... индуский код по крайней мере работает.

ЗЫ. Звиняйте. Накипело.




12.05.10 03:48: Перенесено из 'Коллеги, улыбнитесь'
12.05.10 22:20: Перенесено модератором из 'О работе' — Valery A. Boronin
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.