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

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

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

Регистрация: May 2009
Сообщений: 63
По умолчанию Замена текста "по правилам": Нужна помощь с методом проверки соответсвий.

Здравствуйте.

Понадобилась функция, способная изменять переданную ей строку по определенным правилам (например переводить латиницу в кириллицу, но НЕ ПОСИМВОЛЬНО, а "поблочно"). Руководствуясь теми скромными знаниями, что имею, написал такой код (упрощенный):
Код:
function charConv(str:String){
var arr:Array = [//массив с "правилами" замены:
["shi", "ши"],
["a", "а"], 
["wa", "ва"], 
["se", "сэ"]
]
for (var i:Number = 0; i<arr.length; i++){
if(str.indexOf(arr[i][0]) != -1){
str = str.replace(new RegExp(arr[i][0]), arr[i][1])//замена
}
}
return str;
}
Проблема в том, что при таком способе поиска совпадений (через цикл), важен их порядок. И если он нарушен, возникнут проблемы, например такой вызов:
Код:
trace(charConv("shiwa"))
вернет "шиwа" вместо "шива", так как "а" цикл "найдет" раньше, чем "wa".

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

Старый 19.07.2009, 23:02
alekslitvinenk вне форума Посмотреть профиль Отправить личное сообщение для alekslitvinenk Посетить домашнюю страницу alekslitvinenk Найти все сообщения от alekslitvinenk
  № 2  
Ответить с цитированием
alekslitvinenk
 
Аватар для alekslitvinenk

Регистрация: Oct 2005
Адрес: Москва
Сообщений: 491
Отправить сообщение для alekslitvinenk с помощью ICQ Отправить сообщение для alekslitvinenk с помощью AIM Отправить сообщение для alekslitvinenk с помощью Skype™
Можно поступить так:

Код AS3:
function convert(piece:String, pos:uint, _source:String):String{
	var rez:String = "<->";
	switch(piece){
		case "shi":
			rez = "ши";
		break;
 
		case "a":
			rez = "а";
		break;
 
		case "wa":
			rez = "ва";
		break;
 
		case "se":
			rez = "се";
		break;
	}
	return rez;
}
 
function translit(str:String):String{
	str = str.replace(new RegExp(/shi|a|wa|se/g), convert);
	return str;
}
 
trace(translit("shiwa"));

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
берете слово и сравниваете N'ое кол - во его символов начиная сначала с вашим шифром, после того как нашли сходство записываете в переменную, скажем, newStr - код найденной последовательности, после из переводимого слова, исключаете найденные символы, и повторяете оперецию снова, только! к переменной newStr прибавляете новый код, а не переписываете ее, и так до конца слова.... думаю принцип таков

Старый 20.07.2009, 00:19
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 4  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> нечувствительный к порядку "правил"
Такое может быть только если правила не взаимоисключающие...
__________________
Hell is the possibility of sanity

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

Регистрация: May 2009
Сообщений: 63
Понятно. Всем большое спасибо за информацию...
Судя по всему, в моем случае "ручками" - самый удобный вариант.

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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