Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.05.2011, 13:25
_sestra_ вне форума Посмотреть профиль Отправить личное сообщение для _sestra_ Найти все сообщения от _sestra_
  № 1  
Ответить с цитированием
_sestra_
 
Аватар для _sestra_

Регистрация: Dec 2005
Сообщений: 219
Отправить сообщение для _sestra_ с помощью ICQ Отправить сообщение для _sestra_ с помощью Skype™
По умолчанию Парсинг 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 [];
	}
Прошу помощи привести это в божеский вид Скрипт работает, но какой-то не красивый
__________________
Счастье - это хорошее здоровье и плохая память

Старый 04.05.2011, 13:32
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 2  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
я бы разбил по частям данный код, отдельную функцию на парсинг функции отдельно аргументов. Так легче потом модифицировать код, да и читается легче.
кст. а почему не регулярными выражениями?

Старый 04.05.2011, 13:36
_sestra_ вне форума Посмотреть профиль Отправить личное сообщение для _sestra_ Найти все сообщения от _sestra_
  № 3  
Ответить с цитированием
_sestra_
 
Аватар для _sestra_

Регистрация: Dec 2005
Сообщений: 219
Отправить сообщение для _sestra_ с помощью ICQ Отправить сообщение для _sestra_ с помощью Skype™
Цитата:
кст. а почему не регулярными выражениями?
Не силен в них, если поможешь буду благодарен
__________________
Счастье - это хорошее здоровье и плохая память

Старый 04.05.2011, 13:43
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 4  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
Цитата:
Сообщение от _sestra_ Посмотреть сообщение
Не силен в них, если поможешь буду благодарен
знаешь, тут дело практики, я научился на онлайн инструментах. погугли, выбери по вкусу, их дофига... и методом русского тыка и с поддержкой мануала можешь понять все бенефиты регулярных выражений

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

Старый 04.05.2011, 13:53
_sestra_ вне форума Посмотреть профиль Отправить личное сообщение для _sestra_ Найти все сообщения от _sestra_
  № 5  
Ответить с цитированием
_sestra_
 
Аватар для _sestra_

Регистрация: Dec 2005
Сообщений: 219
Отправить сообщение для _sestra_ с помощью ICQ Отправить сообщение для _sestra_ с помощью Skype™
Ну в принципе все по тексту:

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


Последний раз редактировалось _sestra_; 04.05.2011 в 14:04.
Старый 04.05.2011, 14:03
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 6  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
Цитата:
Сообщение от _sestra_ Посмотреть сообщение
Ну в принципе все по тексту:
1) взять весь текст после строки "javascript:"
до каких пор ищем? т.е. тут ясно где начинать парсить но не ясно где конец примером конца может служить "</script>" можете бросить часть кода и показать что вы хотите найти в нем

Цитата:
Сообщение от _sestra_ Посмотреть сообщение
2) взять строку до первой "(" и убрать лишние пробелы
регулярные выражение несколько иначе нужно рассматривать, это в цыкле вы идете до первого вхождения и чтот с этим вхождением делаем.... а в регулярном выражении мы четко знаем что нам искать
пример: название функции , список аргументов, тело функции

Цитата:
Сообщение от _sestra_ Посмотреть сообщение
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/


Последний раз редактировалось cremnet; 04.05.2011 в 14:23.
Старый 04.05.2011, 14:45
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
А в чем смысл задумки? Почему сразу не передать?

ЗЫ:
3) взять строку между первой
Регулярными выражениями проблема сбалансированных скобок не решается впринципе. Чтобы понять о чем речь:
Код:
function foo(){ return "(parens((:-)".replace(/\((.)"/g; }
foo((a + b).toString(isNaN(b / a) + 8))).charAt(":(((((".indexOf("("));
//
Как вам такой вариант?
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 04.05.2011 в 14:52.
Старый 04.05.2011, 16:07
_sestra_ вне форума Посмотреть профиль Отправить личное сообщение для _sestra_ Найти все сообщения от _sestra_
  № 8  
Ответить с цитированием
_sestra_
 
Аватар для _sestra_

Регистрация: Dec 2005
Сообщений: 219
Отправить сообщение для _sestra_ с помощью ICQ Отправить сообщение для _sestra_ с помощью Skype™
Цитата:
Сообщение от wvxvw Посмотреть сообщение
А в чем смысл задумки? Почему сразу не передать?
Конечно такой код куда проще:
Код AS3:
navigateToURL(new URLRequest('javascript:func()'), '_self');
Но, под некоторыми браузерами при таком запросе открывается новая вкладка. Например в Firefox. Конечно, это проблема, скорее, не скрипта а браузера/плагина. Если вы знаете как это исправить, был бы счастлив.
__________________
Счастье - это хорошее здоровье и плохая память


Последний раз редактировалось _sestra_; 04.05.2011 в 16:10.
Создать новую тему Ответ Часовой пояс GMT +4, время: 06:44.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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