Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Парсинг Javascript-а (http://www.flasher.ru/forum/showthread.php?t=155412)

_sestra_ 04.05.2011 13:25

Парсинг Javascript-а
 
Написал парсинг для JavaScript - конструкции с последующей отправкой по ExternalInterface:
Код AS3:

public static function getJavaScript (baseUrl:String):Array // возвращаем массив Fn, arg1, arg2, arg3
        {
                if (baseUrl.indexOf('javascript:') != -1)
                {
                        var js:String = baseUrl.split('javascript:')[1];
                        var fn:String = js.substr(0, js.indexOf('(', 0)).split(' ').join(''); // имя ф-ции без лишних пробелов
                        var args:Array = js.substr(js.indexOf('(', 0)+1, js.indexOf(')', 0) - js.indexOf('(', 0) - 1).split(','); // массив аргументов
                        for (var a:uint = 0; a < args.length; a++) // чистим аргументы от ненужных кавычек
                        {
                                var quotes:String = '"'; // смотрим в какие кавычки засунута строка
                                if (args[a].lastIndexOf("'") > args[a].lastIndexOf('"')) quotes = "'";
                                if (args[a].indexOf(quotes) != -1) args[a] = args[a].substr(args[a].indexOf(quotes, 0)+1, args[a].lastIndexOf(quotes) - args[a].indexOf(quotes, 0) - 1); // выделяем строку между соотв. кавычками
                        }
                        args.unshift(fn); // добавляем в массив имя ф-ции
                        return args;
                }
                return [];
        }

Прошу помощи привести это в божеский вид :) Скрипт работает, но какой-то не красивый

cremnet 04.05.2011 13:32

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

_sestra_ 04.05.2011 13:36

Цитата:

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

cremnet 04.05.2011 13:43

Цитата:

Сообщение от _sestra_ (Сообщение 993801)
Не силен в них, если поможешь буду благодарен

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

могу помочь в конкретном регулярном выражении, напиши что хочешь найти и я в ответ напишу регулярное

_sestra_ 04.05.2011 13:53

Ну в принципе все по тексту:

1) взять строку до первой "(" и убрать лишние пробелы
2) взять строку между первой "(" и последней ")"
3) проверить какой последний символ: " (двойная кавычка), ' (одинарная), х (не кавычка)

cremnet 04.05.2011 14:03

Цитата:

Сообщение от _sestra_ (Сообщение 993809)
Ну в принципе все по тексту:
1) взять весь текст после строки "javascript:"

до каких пор ищем? т.е. тут ясно где начинать парсить но не ясно где конец примером конца может служить "</script>" можете бросить часть кода и показать что вы хотите найти в нем

Цитата:

Сообщение от _sestra_ (Сообщение 993809)
2) взять строку до первой "(" и убрать лишние пробелы

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

Цитата:

Сообщение от _sestra_ (Сообщение 993809)
3) взять строку между первой "(" и последней ")"

вот тут уже больше конретики только нужно уточнение есть ли скобки между скобками?
Код AS3:

var pattern:RegExp = new RegExp("\(([^\)]*?)\)", "g");

Добавлено через 17 минут
Код:

function([^\(]*?)\(([^\)]*)\)[^\{]*\{(.*?)\}
(незабываем про ключи)
Вот регулярное выражение на парсирование простых фукций оно работает для
Код:

function test(a,b,c) {
alert('hello world');
}
function(){return true;}

но! это са-амый простой его вариант так как тут не учитывается что в теле функции будет много всякого кода

Добавлено через 19 минут
мой любимый тестер http://gskinner.com/RegExr/

wvxvw 04.05.2011 14:45

А в чем смысл задумки? Почему сразу не передать?

ЗЫ:
3) взять строку между первой
Регулярными выражениями проблема сбалансированных скобок не решается впринципе. Чтобы понять о чем речь:
Код:

function foo(){ return "(parens((:-)".replace(/\((.)"/g; }
foo((a + b).toString(isNaN(b / a) + 8))).charAt(":(((((".indexOf("("));
//

Как вам такой вариант? :)

_sestra_ 04.05.2011 16:07

Цитата:

Сообщение от wvxvw (Сообщение 993823)
А в чем смысл задумки? Почему сразу не передать?

Конечно такой код куда проще:
Код AS3:

navigateToURL(new URLRequest('javascript:func()'), '_self');

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


Часовой пояс GMT +4, время: 07:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.