Дано: толковый паренек, только что закончивший вуз и неплохо разбирающиеся в ассемблере, плюсах, скриптовых языках и всякой прочей околбасице. энергичный, обучаемый. Но ленивый до ужаса...
Задание: написать на 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.