Просмотр полной версии : пробелы...
Вот такая трабла :
у меня , допустим , есть строка -
"флэша рулит по-полной"
как видите, между каждыми словами немеренно пробелов, как же мне преобразовать это в -
"флэша рулит по-полной"
то-есть убить лишние пробелы, и оставить между словами только по-одной штучке ? ? ?
Всё дело в том что каждый раз точное количество пробелов между этими словами мне не известно, но в конце-концов надо получить по-одному пробелу между каждым словом.
Уф-ф-ф..
Вроде понятно всё описал.
Люди добрые помогите плизззз ! ! !
гыгы...
Вот именно такая система, как на форуме мне и нужна.
:)
В первом сообщении у меня между словами ("флэша рулит")немерянно пробелов, а форумный код сократил их до одного между каждым словом.
Можно ли во флэше сделать так-же.
FreeLander
11.10.2004, 11:15
класс String - там для этого всё есть
thanks FreeLander !
Объясни плз поподробнее , если не трудно...
А то я не совсем понимаю...
Где же твоя спасительная рука помощи FreeLander !!?
Я весь внимание !!!
вариант:
s="флэша рулит по-полной "
var a=s.split(" "),n=0
while(n<a.length){
while(a[n]!="")n++
while(a[n]=="")a.splice(n,1)
}
s=a.join(" ")
trace(s)//флэша рулит по-полной
Nox Noctis
12.10.2004, 11:51
я бы сделал так:
s = "флэша рулит по-полной ";
String.prototype.compact = function() {
var str = this.valueOf();
var heap = str.split(" ");
while (heap.length>1) {
str = heap.join(" ");
heap = str.split(" ");
}
return str;
};
trace(s.compact());быстрее :)
silin ! ! !
вах-х-х !
спасибо !
Но я тебя ещё слегка грузану...
А что делать если человек нажал "enter" и перешёл на другую строку ?
Это как бы тоже пробел, или нет ?
И ,если не трудно , опиши ,пож , как твоя система работает, очень хочется самому понять....
Еще раз благодарю...
Nox !
А тебе отдельная благодарность...
Твой код реально быстрее ?
Или :) ?
Твой пост пришёл как раз тогда когда я отвечал на мессагу silin'а ....
Nox Noctis
12.10.2004, 12:22
Оригинал написал(а) spartan
Твой код реально быстрее ?это нетрудно проверить..
test = "флэша рулит по-полной ";
String.prototype.compact1 = function() {
var a = this.split(" "), n = 0;
while (n<a.length) {
while (a[n] != "") {
n++;
}
while (a[n] == "") {
a.splice(n, 1);
}
}
return a.join(" ");
};
String.prototype.compact2 = function() {
var str = this.valueOf();
var heap = str.split(" ");
while (heap.length>1) {
str = heap.join(" ");
heap = str.split(" ");
}
return str;
};
this.onMouseDown = function() {
s = getTimer();
for (var i = 0; i<1000; i++) {
test.compact1(); // в среднем 612 мсек
// test.compact2(); // в среднем 175мсек
}
e = getTimer();
trace(e-s);
};
пощелкай по сцене, посмотри какие числа выпадают.
потом раскоментируй вызов compact2 и закомментируй вызов compact1.
сравни
можно также стравнить со встроенными возможностями:
TextField.condenseWhite
Nox Noctis
12.10.2004, 18:21
Оригинал написал(а) BitSky
можно также стравнить со встроенными возможностями:
TextField.condenseWhite это ты конечно прав. но заметим:
TextField.condenseWhite
Property; a Boolean value that specifies whether extra white space (spaces, line breaks, and so on) in an HTML text field should be removed when the field is rendered in a browser.
this.createTextField("my_txt", 0, 0, 0, 300, 100);
this.my_txt.text = "Hello world!";
this.onMouseUp = function() {
var is_html = this.my_txt.html;
var txt = this.my_txt.htmlText;
this.my_txt.html = true;
this.my_txt.condenseWhite = true;
this.my_txt.htmlText = txt;
this.my_txt.html = is_html;
}; - никто не мешает поле сделать HTML-ным и затем вернуть в исходное состояние. Я не вижу никаких проблем.
или сделать так:String.prototype.compact3 = function () {
var d = _root.getNextHighestDepth()
d=d<0 ? 1 : 0
var mc = _root.createEmptyMovieClip("", d)
mc.createTextField("my_txt", 0, 0, 0, 300, 100);
var my_txt = mc.my_txt
my_txt.html = my_txt.condenseWhite = true
my_txt.text = this.valueOf()
var text = my_txt.text
mc.removeMovieClip();
return text
} - кривовато, но получается всё равно в раза три быстрее, правда только при обработке больших текстов, что мне кажеся несколько более актуальным.
Впрочем... не принципиально, если нужно работать со строкой, но совсем другое дело, если нужно текст показать в текст поле.
Nox Noctis
12.10.2004, 19:21
да, ты прав :)
забыли про стандартное, размышляя о ремесле :))
Ну парни....
Искренне благодаою !!!
Всё разжевали , объяснили...
Ещё раз спасибо !
Я тут начал ещё один топик, думаю он вас заинтересует....
вот здесь (http://www.flasher.ru/forum/showthread.php?threadid=63713)
UPS !!!
Ещё одна трабла.
У меня есть также строчка наподобии :
"Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й"
Блин вот её то и не надо сокращять...
То есть она должна остаться такой-же.
Выручайте...
предидущий пост :
"флэша рулит по-полной"
все буквы большие, между каждой расстояние в один пробел,
между словами - по два пробела.
(система флэшера урезала немного :)))
если буквально :) :
s="Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й"
String.prototype.compact = function() {
if(this=="Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й") return this;
var str = this.valueOf();
var heap = str.split(" ");
while (heap.length>1) {
str = heap.join(" ");
heap = str.split(" ");
}
return str;
};
trace(s.compact());
зы: формулировать надо понятнее
что не сокращать :между словами ФЛЭШ , РУЛИТ, двойные между заглавными, вообще ничего между заглавными, короче критерий нужен
ну это я пробовал, дело в том что значение
s="Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й";
постоянно изменяется, то бишь так сравнивать её нельзя
if(this=="Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й") return this;
переменная может принять любое значение, хоть :
s="П Э И Н Т Р У Л И Т";
так что надо как-то задать условие, что если переменняя из заглавных букв и между ними пробелы, то не урезать их..
вопр: как ??(всё мне объясни, всё мне расскажи, свалился ,понимаешь, на ваши головы и напрягаю :) )
вроде усё.
мля, постоянно забываю про систему форума:
s="Ф Л Э Ш А Р У Л И Т П О - П О Л Н О Й";
s="П Э И Н Т Р У Л И Т";
но при этом не надо забывать про предидущюю систему, которая сокращала пробелы между "правильными" словами.
опнимаете она тоже должна работать.
Пытаюсь их как-то сконтачить...
Нужно чтоб пробелы между нормальными словами сокращались (до одного),а между мутантами("Ф Л Э Ш А") нет.
Переменная "s" может принимать значение и нормального слова и слова-мутанта .
Вот такой пропаринг.
а у тебя небудет проблем с тем, что придется включать словарь русского языка для проверки слов на мутант-не мутант?
словарь несколько увеличит размер ролика.
Что-то я не понимаю, какой словарь ?
Разве флэшик не может определить, большие символы используются или маленькие, и есть ли между ними пробелы или нет ?
а...
я щас догнал, что ты имел ввиду.
я бы рекомендовал не юзать мутантов, а юзать другой шрифт.
Блин какой шрифт ?
если человек привык Юзать огромные буквы и пробелы между ними то ничего не поделаешь, отображать надо желание пользователя системой - это закон.
Надо предусмотреть все возможные варианты....
Ведь на форуме многие пишут "С П А С И Б О О Г Р О М Н О Е"
и система показывает зтот текст без пробелов между словами,
хотя человек специально сделал два (!) пробела между соседними словами.
Слова-мутанты это и есть "В О Т Т А К И Е С Л О В А"...
А мне надо чтоб это предстало пред глазами вот в таком виде:
"В О Т Т А К И Е С Л О В А"
как видишь - по пробелу между буквами и по два пробела между словами.
А то мне показалось - ты немного не понимаешь о чём я говорю..
ок. ты только скажи, как ты собираешься вычислять что это слова-мутанты, чтобы выдрать их из общего текста и применить к ним отдельные правила форматирования. а дальше уже разберемся :).
моё имхо - корректно сделать это маловероятно, ибо:
1. если пользователь поставил 3-4 пробела между словами, то что делаем?
2. если пользователь ставит по 2-3 пробела между буквами, то что делаем?
3. если пользователь ставит пробелы между буквами в нижнем регистре, то что делаем?
...и еще примерно 200-300 подобных вариаций.
Думаю, что сделать поиск и замену чего угодно на что угодно не трабл. В данном случае проблема в том, по каким правилам такую замену производить. Поверь, ни одно правило в данном случае корректно работать не будет.
Насчет А то мне показалось - ты немного не понимаешь о чём я говорю - я (и любой другой человек) понимаю или не понимаю тебя ровно настолько, насколько внятно ты сформулировал свою мысль.
Если весь мир повернулся к тебе задом, проверь, может это ты не с той стороны стоишь?
Ваня слушай вопрос.
Если я интервалом делаю дублирование клипов, но интервал у меня меньше, чем время смены фрейма, то что делает флеш плеер:
- он дублирует его в промежутке, но резултат показывает после смены кадра
- он дублирует его только после смены кадра?
ты во все топики это запостил? :)
проверь сам.
ставишь fps =1
запускаешь интервал
в интервале вызываешь показ i++ в текст поле.
О, это идея, надо попробовать.
Глючит это только при загрузке, когда загружено всё работает нормально.
Спасибо.
Ваня слушай вопрос.
Если я интервалом делаю дублирование клипов, но интервал у меня меньше, чем время смены фрейма, то что делает флеш плеер:
- он дублирует его в промежутке, но резултат показывает после смены кадра
- он дублирует его только после смены кадра?
ой, что это??
По поводу невнятно сформулированного вопроса ты прав.
Сейчас разложу всё по-полочкам :
переменная (допустим var1) может содержать в себе два вида строки :
1) с нормальными словами
var1 = "хеллоу ворлд"
2)с словами-мутантами
var1=" Х Е Л Л О У В О Р Л Д"
Так вот,в строке с нормальными словами - огромное кол-во пробелов между этими самыми словами...
Код предложенный Nox'ом на предидущей странице сокращал эти самые пробелы до одного между кождым вордом.
НО ! тут вмешались слова-мутанты, которые не хотят чтобы сокращяли пробелы между ними(то-есть с ними вообще не нало ничего делать, нужно оставить их в покое).
вот система, как мне она представляется в AS(теоретически) :
if(var1!=""){
if(var1 состоит из нормальных слов){
if(в переменной между словами больше одного пробела){
cократить до одного между каждым словом
}else{
не трогать переменную
}else if (var1 состоит из слов-мутантов){
не трогать переменную
}
Ну, вроде довольно ясно объяснил.
Nox Noctis
14.10.2004, 17:58
Оригинал написал(а) spartan
Ну, вроде довольно ясно объяснил. для плясок с бубно - вполне понятно. для составления алгоритма - не очень.
нужны критерии, по которым определяется, что "var1 состоит из нормальных слов" или "var1 состоит из слов-мутантов".
не понятно что является критерием.
нужно что-то вроде такого правила:
если по соседству стоят две заглавные буквы, то пробелы между ними не сокращаются.
какие правила у тебя?
Ну чтож ты так надо мной издеваешься ?
Всё же понятно, даже моей кошке, а пример кода (теоретический) это всего лишь мои личные думки, ведь я не знаю в точности каким должен быть алгоритм...
если по соседству стоят две заглавные буквы, то пробелы между ними не сокращаются.
вот они правила !
точно я не знаю какие они должны быть, если бы знал , то не спрашивал.
Критерии я у вас, добрые люди, прошу.
они настолько широки, что их нет.
я об этом тебе уже в 10й раз пытаюсь сказать.
Nox Noctis
14.10.2004, 20:08
ну так спроси у своей кошки, а?
если ты не знаешь првил по которым нужно определять, что слово является мутантом или является нормальным - то я их тоже не знаю. боюсь, что Ив тоже нет. это зависит только от того что тебе нужно. если вы с кошкой это знаете - то мы-то тут при чем?
если тебе нужно реализовать функцию с учетом именнно такого правила:если по соседству стоят две заглавные буквы, то пробелы между ними не сокращаютсято это может выглядеть примерно так:String.prototype.isCapital = function() {
if (this.length != 1) {
return undefined;
}
// eng: 65 = A : 122 = z
// ru: 1040 = А : 1103 = я
var code = this.charCodeAt(0);
if ((code>64 && code<123) || (code>1039 && code<1104)) {
return (this.toUpperCase() == this.valueOf());
}
return undefined;
};
String.prototype.compact = function() {
var idx = 0, result = this.valueOf();
while (idx<result.length) {
var s = result.indexOf(" ", idx);
var e = s+1;
while (result.charAt(e) == " ") {
e++;
}
if (e != s+1) {
var pflag = result.charAt(s-1).isCapital();
var nflag = result.charAt(e).isCapital();
if (!(pflag*nflag)) {
result = result.substring(0, s)+" "+result.substr(e);
}
}
idx = e;
}
return result;
};
//
s = " Ф Л Э Ш А Рулит по-полной ";
trace(s.compact());поздравим нас с тем, что мне было не лень это писать.
БЛИН-Н-Н ЁЛЫ-ПАЛЫ ВОТ ЭТО Д-А-А-А-А!!!!
НАКОНЕЦ-ТО-О-О-О!!!!
УРА-УРА-УРА!!!
ГИП-ГИП УРА-А-А-А!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Nox, с огромным удовольствием пригласил бы тебя выпить !пивчелло вместе , но не могу: !
1) вряд-ли ты живёшь в Мурманске . !
2) Наверное от всех предложений выпить пиво тебя уже !тошнит. !
3)Я честно говоря, его вообще не пью... !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
всё бы хорошо.
но твоя система настолько сложна что я вней вряд ли сам разберусь.
вообщем всё отлично работает, но если строка/значение переменной правильное (например s="флэша рулит")
то код выполняет бесконечный цикл и виснет.
А в остальном всё-лучше не бывает !
Это последняя просьба, больше мне вряд ли что-нибудь понадобится...
Nox Noctis
14.10.2004, 22:06
наверное можно изящнее придумать, но мне лень, если честно...
String.prototype.isCapital = function() {
if (this.length != 1) {
return undefined;
}
// eng: 65 = A : 122 = z
// ru: 1040 = А : 1103 = я
var code = this.charCodeAt(0);
if ((code>64 && code<123) || (code>1039 && code<1104)) {
return (this.toUpperCase() == this.valueOf());
}
return undefined;
};
String.prototype.compact = function() {
var idx = 0, result = this.valueOf();
while (idx<result.length) {
var s = result.indexOf(" ", idx);
if (s>=0) {
var e = s+1;
while (result.charAt(e) == " ") {
e++;
}
if (e<result.length && e != s+1) {
var pflag = result.charAt(s-1).isCapital();
var nflag = result.charAt(e).isCapital();
if (!(pflag*nflag)) {
result = result.substring(0, s)+" "+result.substr(e);
}
}
idx = e;
} else {
idx = result.length;
}
}
return result;
};код не сложный - всё тупо по алгоритму, без выпендров.
Ещё раз спасибо !
Это как раз то что я хотел !
Иногда смотришь на таких "маньяков AS" снизу вверх и, с грустью понимаешь до чего ничтожны твои знания :( ,
Но, не вешать нос ! Всё ещё впереди (надеюсь :)).
Один личный вопрос к тебе, Nox :
сколько времени ты занимаешся этим делом ? (каким??, ну конечно кодингом в AS .... , а вы что подумали ? :) )
Блин, так хочется самому разобраться в таких системах,
чтобы потом просто не спрашивать на форумах, а писать самому... Думаю, как только появится свободное время - сразу этим и займусь. (это не просьба объяснить мне работу системы, это мои рассуждения вслух )
Nox Noctis
15.10.2004, 12:21
Оригинал написал(а) spartan
сколько времени
чуть больше четырёх лет :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.