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

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

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

Регистрация: Nov 2007
Сообщений: 28
По умолчанию Проблема с регуляркой

Имею обрабатываемый отрезок xml:

Код:
<fresult t="9">
<i>
{exp3}
</i>
<i>
{m5}
</i>
<i>
{lvl2|str}
</i>
<i>
{skill3|1}
</i>
</fresult>
Алгоритм обработки:

Код AS3:
var i:int;
var txt:String = '<b>Результаты боя:</b>\n\n';
 
for (i=0;i<_xml.fresult.children().length();i++) {
	txt += '\n\n- '+_xml.fresult.children()[i].toString();
}
 
txt = txt.replace(/\{exp([0-9]+?)\}/,'Очков опыта получено: $1');
txt = txt.replace(/\{m([0-9]+?)\}/,'Монет получено: $1');
 
var lvl_reg:RegExp = /\{lvl([0-9]+?)\|(str|spd|agi)\}/;
var lvl_matches:Array = txt.match(lvl_reg);
if (lvl_matches) {
	var lvl_p:Array = new Array();
	lvl_p['str'] = 'сила';
	lvl_p['spd'] = 'скорость';
	lvl_p['agi'] = 'ловкость';
	txt = txt.replace(lvl_reg,'Вы перешли на '+lvl_matches[1]+'й уровень, '+lvl_p[lvl_matches[2]]+' увеличена на 1');
}
 
var skill_reg:RegExp = /\{skill([0-9]+?)\|([0-9]+?)\}/;
var skill_matches:Array = txt.match(skill_reg);
if (skill_matches) {
	var s:Object = Main.skillInfo(skill_matches[1],skill_matches[2]);
	txt = txt.replace(skill_reg,'Изучен навык: '+s.n+' (уровень '+skill_matches[2]+')');
}
В большинстве случаев на выходе всё нормально и мы имеем следующий текст:

Код:
Результаты боя:


- Очков опыта получено: 3

- Монет получено: 5

- Вы перешли на 2й уровень, сила увеличена на 1

- Изучен навык: Мастер блокировки (уровень 1)
Но изредка (примерно каждый 15й-20й случай) на выходе нет двух последних пунктов:

Код:
Результаты боя:


- Очков опыта получено: 3

- Монет получено: 5
Что сделал не так, что нужно исправить? Спасибо заранее.

Старый 18.02.2010, 12:30
proxiServer вне форума Посмотреть профиль Отправить личное сообщение для proxiServer Найти все сообщения от proxiServer
  № 2  
Ответить с цитированием
proxiServer
 
Аватар для proxiServer

Регистрация: Jun 2006
Сообщений: 400
Можете выложить xml при котором сбоит?

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

Регистрация: Nov 2007
Сообщений: 28
Хорошо, правда остальная часть во-первых малопонятна посторонним, во-вторых не влияет на эту часть алгоритма. XML во всех тестах всегда один, этот:

Код:
<response>
<fighters s="1">
<f id="123" n="ЦарьЛеонидэ" hp="85" mn="50" mnmx="50" str="5" spd="2" agi="1" lvl="1">
<st race="4" sex="1" teeth="9" hair="3" haircolor="6" beard="7"/>
<q2>
Сосни!
</q2>
</f>
<f id="456" n="Адiк Гiтлер" hp="66" str="2" spd="1" agi="2" lvl="1">
<st race="3" sex="1" teeth="7" hair="1" haircolor="1" beard="0" hat="1" jacket="2" pants="1" cloak="1"/>
<q2>
Вытри сопли, слабак!
</q2>
<q3>
Я тебя найду и отомщу!
</q3>
</f>
</fighters>
<t n="1" p="1" mn="35" t="2" tl="1">
<h nhp="47" c="1"/>
<h e="1"/>
<h nhp="42"/>
<h nhp="37"/>
</t>
<t n="2" p="2" it="19" t="8" tl="3">
<h h="66"/>
</t>
<t n="3" p="2" t="h2">
<h nhp="62"/>
</t>
<t n="4" p="1" mn="5" t="1" tl="2">
<h nhp="0"/>
<h teeth="2" nhp="0" b="1"/>
</t>
<w n="1" t1="5" t2="4"/>
<fresult t="9">
<i>
{exp3}
</i>
<i>
{m5}
</i>
<i>
{lvl2|str}
</i>
<i>
{skill3|1}
</i>
</fresult>
</response>

Старый 18.02.2010, 12:47
proxiServer вне форума Посмотреть профиль Отправить личное сообщение для proxiServer Найти все сообщения от proxiServer
  № 4  
Ответить с цитированием
proxiServer
 
Аватар для proxiServer

Регистрация: Jun 2006
Сообщений: 400
Цитата:
<q2>
Вытри сопли, слабак!
</q2>
<q3>
Я тебя найду и отомщу!
</q3>
=))

Если во всех случаях поступает !одинаковый xml на вход, то должно всегда отрабатывать правильно, так? Значит что-то с xml не так все-таки. 100% одинаковый xml? пробовали его прям в код засунуть?

И вы мне структуру xml показали вроде как. А что бы разобраться нужно смотреть именно то, что пришло. Непосредственно с параметрами. Скорей всего пробельчик какой проскакивает где-то.


Последний раз редактировалось proxiServer; 18.02.2010 в 12:49.
Старый 18.02.2010, 13:00
Ануб вне форума Посмотреть профиль Отправить личное сообщение для Ануб Найти все сообщения от Ануб
  № 5  
Ответить с цитированием
Ануб

Регистрация: Nov 2007
Сообщений: 28
Нашёл что-то:

for (i=0;i<_xml.fresult.children().length();i++) {
txt += '\n\n- '+_xml.fresult.children()[i].toString();
}

trace(txt+' (итого длина: '+_xml.fresult.children().length()+')');

Так вот иногда вместо 4 показывает собственно 2. Хотя у меня нигде нет строки, как-либо обрезающей _xml.fresult и его дочерние ветки.

Добавлено через 6 минут
Всё, проблема исчерпана, XML в этом месте как раз не был идентичен. Мой глюк Алгоритм абсолютно стабильный.


Последний раз редактировалось Ануб; 18.02.2010 в 13:07.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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