Xpoint
   [напомнить пароль]

Расчёт строки - аргумента функции JavaScript!

Метки: [без меток]
2006-01-30 02:12:06 [обр] TJmaster(0/2)[досье]

Вот такая задачка стала перед о мной, пытаюсь это быстро решить, а без регулярных будет сложно.
JavaScript должен найти в строке:
document.write("12345678" +"91234");
document.write('12345678' + '91234');

Регулярное выражение должно найти именно это 1234567891234 :) Прошу Вас помочь!

спустя 9 минут [обр] Алексей В. Иванов(17/2861)[досье]
По мне описано сумбурно и непонятно.
Какой "JavaScript должен найти"? Причем тут Perl тогда? Что значит "должно найти именно это..."?
спустя 9 часов [обр] TJmaster(0/2)[досье]

Вот строка в которой ищем:

document.write("12345678" +"91234");

Получить в результате надо: 1234567891234

спустя 13 минут [обр] Алексей Севрюков(45/1292)[досье]
Алексей В. Иванов[досье] Ему видимо нужно на Perl регулярное выражение, которое будет искать строки с учетом того, что они могут быть разбиты на группы по JS синтаксису.
спустя 6 минут [обр] Алексей В. Иванов(17/2861)[досье]
"Можете меня убить, но сапоги Вам мои не достануться", кажется, это так называется.
TJmaster[досье] что в Вашем понятии значит "Получить в результате"?
спустя 1 минуту [обр] arto(42/497)[досье]
m|document\.write\s*\(\s*"([^"]*)"\s*\+\s*"([^"]*)"\s*\)\s*;| ?
не учитывая вложенные \"
спустя 1 час 17 минут [обр] TJmaster(0/2)[досье]
Спасибо, arto. В принципе это близкое выражение! Да конечно нужно ещё учитывать \" и ещё кавычки могут быть и одинарные! Но главное эти сложение строк в функции могут быть любое количество или не одного ... вот это я не понимаю как сделать!!!
спустя 11 минут [обр] Алексей Севрюков(45/1292)[досье]
Хм, может быть их вообще evalить? Если там конечно переменных никаких нет.
спустя 1 минуту [обр] arto(42/497)[досье]

либо писать свой парсер используя, например, Parse::RecDescent,
либо вручную, типа

my $ret;
if (m|document\.write\(|g) {
  while (m|"([^"]*)"\s*\+\s*|g) { $ret .= $1; }
}

надо доделать условия окончания.

спустя 7 минут [обр] arto(42/497)[досье]
либо while (s|document\.write\("([^"]*)"\s*\+\s*"([^"]*)"|document.write("$1$2"|g) {}
спустя 17 минут [обр] Алексей Севрюков(45/1292)[досье]
+ еще не забываем одинарные кавычки.
спустя 9 часов [обр] Дворнов Роман(3/109)[досье]

Учитывая \', \" и т.п.

$part = qw((?:"((?:\\\\.|[^"])*)"|'((?:\\\\.|[^'])*)'));
$test = "document.write('123'+\"345\"+''+'\\\''+\"\\\"\")";
$res = '';
if ($test =~ /document\.write\(\s*$part\s*((?:\s*\+\s*$part)*)\s*\)/)
{
  $res = $1 || $2;
  $other = $3;
  while ($other =~ s/\+\s*$part\s*/$res.=($1 || $2)/ge) {}
}
print 'answer: ' . $res;

?

Powered by POEM™ Engine Copyright © 2002-2005