PDA

Просмотр полной версии : Trim функция в ActionScript


OracleN
18.04.2007, 20:00
Господа, а не подскажете ли вы есть ли здесь trim функция (надеюсь ее назначение ясно) или надо самому создвать ее?

etc
18.04.2007, 20:05
Самому.

CorC
19.04.2007, 10:03
Варианты по этой функции уже были предложены на этом форуме, ищите

OracleN
19.04.2007, 11:31
Варианты по этой функции уже были предложены на этом форуме, ищите

Сам решил написать, вот что получилось

function rtrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(matter.length-inSymbol.length,inSymbol.length) == inSymbol) {
matter = matter.substr(0,matter.length - inSymbol.length)
}
return matter;
}

function ltrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(0,inSymbol.length) == inSymbol) {
matter = matter.substr(inSymbol.length,matter.length)
}
return matter;
}

function trim(matter,inSymbol) {
return ltrim(rtrim(matter,inSymbol),inSymbol);
}

iNils
19.04.2007, 11:38
Сам решил написать, вот что получилось
Ужас. Вот метод работающий в 20 раз быстрее.
function trimss (str:String):String {
str = new String (str);
var sx:Number = 0;
var ex:Number = str.length;
while (str.charAt (sx) == " ") {
sx++;
}
while (str.charAt (ex - 1) == " ") {
ex--;
}
str = str.substring (sx, ex);
return str;
}Хотя возможно не предел.

OracleN
19.04.2007, 11:45
Ужас. Вот метод работающий в 20 раз быстрее.
function trimss (str:String):String {
str = new String (str);
var sx:Number = 0;
var ex:Number = str.length;
while (str.charAt (sx) == " ") {
sx++;
}
while (str.charAt (ex - 1) == " ") {
ex--;
}
str = str.substring (sx, ex);
return str;
}Хотя возможно не предел.

Ха.. этот метот убирает только пробелы, а предыдущий имеет возможность убрать любые символы. И почему это в 20 раз быстрее. А не в 2 или даже не в 1.5

etc
19.04.2007, 11:47
function trimss (str:String,symbol:String):String {
str = new String (str);
symbol = symbol.length ? symbol : ' ';
var sx:Number = 0;
var ex:Number = str.length;
while (str.charAt (sx) == symbol) {
sx++;
}
while (str.charAt (ex - 1) == symbol) {
ex--;
}
str = str.substring (sx, ex);
return str;
}

Уверен?

OracleN
19.04.2007, 11:53
Использовать здесь charAt - нельзя, ибо sumbol может быть равныа 'qw' или другим символам (не одному)

iNils
19.04.2007, 11:55
Ха.. этот метот убирает только пробелы, а предыдущий имеет возможность убрать любые символы.Ну __etc уже доказал, что это не так:)
И почему это в 20 раз быстрее. А не в 2 или даже не в 1.5Линейкой измерил :D Запустил обе функции в цикле 1000 раз и посмотрел время необходимое для реализации.

OracleN
19.04.2007, 11:58
Да ну, всеравно символ должен быть с length = 1.

etc
19.04.2007, 12:00
str = 'acacacbbbbddddacacacac';
trim = function(str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf(symbols)==0) {
str = str.substr(symbols.length);
}
while (str.lastIndexOf(symbols)==str.length-symbols.length) {
str = str.substr(0,str.length-symbols.length);
}
return str;
}
trace(trim(str,'ac'));

OracleN
19.04.2007, 12:01
str = 'acacacbbbbddddacacacac';
trim = function(str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf(symbols)==0) {
str = str.substr(symbols.length);
}
while (str.lastIndexOf(symbols)==str.length-symbols.length) {
str = str.substr(0,str.length-symbols.length);
}
return str;
}
trace(trim(str,'ac'));

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

etc
19.04.2007, 12:03
str = 'acacacbbbbddddacacacac';
trim = function(str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf(symbols)==0) {
str = str.substr(symbols.length);
}
while (str.lastIndexOf(symbols)==str.length-symbols.length) {
str = str.substr(0,str.length-symbols.length);
}
return str;
}
function rtrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(matter.length-inSymbol.length,inSymbol.length) == inSymbol) {
matter = matter.substr(0,matter.length - inSymbol.length)
}
return matter;
}

function ltrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(0,inSymbol.length) == inSymbol) {
matter = matter.substr(inSymbol.length,matter.length)
}
return matter;
}

function trim2(matter,inSymbol) {
return ltrim(rtrim(matter,inSymbol),inSymbol);
}
t = getTimer();
for (var i = 0;i<10000;i++) {
trim(str,'ac');
}
trace(getTimer()-t); // 2614
t = getTimer();
for (i = 0;i<10000;i++) {
trim2(str,'ac');
}
trace(getTimer()-t); // 3453

iNils
19.04.2007, 12:05
Хе, я вас сделал, ибо мой НОВЫЙ метод считает в 3-4 быстрее :D
function trims (str:String, symbol:String):String {
symbol = symbol.length ? symbol : ' ';
var array:Array = str.split (symbol);
var sx:Number = 0;
var ex:Number = array.length;
while (array[sx] == "") {
sx++;
}
while (array[ex - 1] == "") {
ex--;
}
array.splice (ex);
array.splice (0, sx);
str = array.join (symbol);
return str;
}

etc
19.04.2007, 12:06
С оптимизацией моего кода:

str = 'acacacbbbbddddacacacac';
trim = function(str, symbols) {
symbols = symbols ? symbols : ' ';
var len = symbols.length;
while (str.indexOf(symbols)==0) {
str = str.substr(len);
}
while (str.lastIndexOf(symbols)==str.length-len) {
str = str.substr(0,str.length-len);
}
return str;
}
function rtrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(matter.length-inSymbol.length,inSymbol.length) == inSymbol) {
matter = matter.substr(0,matter.length - inSymbol.length)
}
return matter;
}

function ltrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
while (matter.substr(0,inSymbol.length) == inSymbol) {
matter = matter.substr(inSymbol.length,matter.length)
}
return matter;
}

function trim2(matter,inSymbol) {
return ltrim(rtrim(matter,inSymbol),inSymbol);
}
t = getTimer();
for (var i = 0;i<10000;i++) {
trim(str,'ac');
}
trace(getTimer()-t); // 1956
t = getTimer();
for (var i = 0;i<10000;i++) {
trim2(str,'ac');
}
trace(getTimer()-t); // 3462

iNils, ага, 987.

iNils
19.04.2007, 12:08
мой на своей машине прогони, должно меньше секунды у тебя считать.

OracleN
19.04.2007, 12:10
str = 'acacacbbbbddddacacacac';
trim = function(str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf(symbols)==0) {
str = str.substr(symbols.length);
}
while (str.lastIndexOf(symbols)==str.length-symbols.length) {
str = str.substr(0,str.length-symbols.length);
}
return str;
}
function rtrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
var ln = inSymbol.length;
while (matter.substr(matter.length-ln,ln) == inSymbol) {
matter = matter.substr(0,matter.length - ln)
}
return matter;
}

function ltrim(matter:String,inSymbol) {
if (inSymbol == undefined) inSymbol = ' ';
var ln = inSymbol.length;
while (matter.substr(0,ln) == inSymbol) {
matter = matter.substr(ln,matter.length)
}
return matter;
}

function trim2(matter,inSymbol) {
return ltrim(rtrim(matter,inSymbol),inSymbol);
}
t = getTimer();
for (var i = 0;i<10000;i++) {
trim(str,'ac');
}
trace(getTimer()-t); // 3247
t = getTimer();
for (var i = 0;i<10000;i++) {
trim2(str,'ac');
}
trace(getTimer()-t); //2793



Попробуй с оптимизацией моего, просто интересно, машины у нас разные.

OracleN
19.04.2007, 12:12
мой на своей машине прогони, должно меньше секунды у тебя считать.
Не не меньше, гдето у меня в 1.3 раза

etc
19.04.2007, 12:13
Ещё в 10 раз быстрее :D :D

str = 'acacacbbbbddddacacacac';
trim = function (str, symbol) {
if (lastStr != str) {
symbol = symbol.length ? symbol : ' ';
var array = str.split(symbol);
var sx = 0;
var ex = str.length;
lastStr = str;
while (array[sx] == "") {
sx++;
}
while (array[ex-1] == "") {
ex--;
}
array.splice(ex);
array.splice(0, sx);
str = array.join(symbol);
return str;
} else {
return lastStr;
}
};
t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(getTimer()-t); // 85

iNils
19.04.2007, 12:17
Ещё в 10 раз быстрее :D :D
Конечно быстрее, он ведь ничего не делает :D :p
str = 'acacacbbbbddddacacacac';
trim = function (str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf (symbols) == 0) {
str = str.substr (symbols.length);
}
while (str.lastIndexOf (symbols) == str.length - symbols.length) {
str = str.substr (0, str.length - symbols.length);
}
return str;
};

trim2 = function (str, symbol) {
if (lastStr != str) {
symbol = symbol.length ? symbol : ' ';
var array = str.split(symbol);
var sx = 0;
var ex = str.length;
lastStr = str;
while (array[sx] == "") {
sx++;
}
while (array[ex-1] == "") {
ex--;
}
array.splice(ex);
array.splice(0, sx);
str = array.join(symbol);
return str;
} else {
return lastStr;
}
};


function trims (str:String, symbol:String):String {
symbol = symbol.length ? symbol : ' ';
var array:Array = str.split (symbol);
var sx:Number = 0;
var ex:Number = array.length;
while (array[sx] == "") {
sx++;
}
while (array[ex - 1] == "") {
ex--;
}
array.splice (ex);
array.splice (0, sx);
str = array.join (symbol);
return str;
}
////////
t = getTimer ();
for (var i = 0; i < 10000; i++) {
trim (str, 'ac');
}
trace (trim (str, 'ac'));
trace (getTimer () - t);
t = getTimer ();
for (var i = 0; i < 10000; i++) {
trim2 (str, 'ac');
}
trace (trim2 (str, 'ac'));
trace (getTimer () - t);
t = getTimer ();
for (var i = 0; i < 10000; i++) {
trims (str, 'ac');
}
trace (trims (str, 'ac'));
trace (getTimer () - t);


Не не меньше, гдето у меня в 1.3 разаЭто я __etc писал.

etc
19.04.2007, 12:21
Подумаешь.

str = 'acacacbbbbddddacacacac';
trim = function (str, symbols) {
symbols = symbols.length ? symbols : ' ';
while (str.indexOf(symbols) == 0) {
str = str.substr(symbols.length);
}
while (str.lastIndexOf(symbols) == str.length-symbols.length) {
str = str.substr(0, str.length-symbols.length);
}
return str;
};
trim2 = function (str, symbol) {
if (lastStr != str) {
lastStr = str;
symbol = symbol ? symbol : ' ';
var array:Array = str.split(symbol);
var sx:Number = 0;
var ex:Number = array.length;
while (array[sx] == "") {
sx++;
}
while (array[ex-1] == "") {
ex--;
}
array.splice(ex);
array.splice(0, sx);
str = array.join(symbol);
outStr = str;
return str;
} else {
return outStr;
}
};
function trims(str:String, symbol:String):String {
symbol = symbol.length ? symbol : ' ';
var array:Array = str.split(symbol);
var sx:Number = 0;
var ex:Number = array.length;
while (array[sx] == "") {
sx++;
}
while (array[ex-1] == "") {
ex--;
}
array.splice(ex);
array.splice(0, sx);
str = array.join(symbol);
return str;
}
////////
t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(trim(str, 'ac'));
trace(getTimer()-t);
t = getTimer();
for (var i = 0; i<10000; i++) {
trim2(str, 'ac');
}
trace(trim2(str, 'ac'));
trace(getTimer()-t);
t = getTimer();
for (var i = 0; i<10000; i++) {
trims(str, 'ac');
}
trace(trims(str, 'ac'));
trace(getTimer()-t);

etc
19.04.2007, 12:29
Выжал ещё 150 мс:

str = 'acacacbbbbddddacacacac';
trim = function(str, symbol) {
symbol = symbol ? symbol : ' ';
var array = str.split(symbol);
var sx = 0;
var ex = array.length;
while (array[sx] == "") {
sx++;
}
while (array[ex-1] == "") {
ex--;
}
str = array.splice(sx,ex-sx).join(symbol);
return str;
}
////////
t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(trim(str, 'ac'));
trace(getTimer()-t); // 831

OracleN
19.04.2007, 12:38
Да клева, тут согласен что в 20 раз быстрее первоначального, хотя мне кажется нужно нормально потестить, бо к примеру если одну комбинацию надо убрать, то тут с массивами не быстрее будет, но надо тестить.

etc
19.04.2007, 12:46
И ещё 170 мс:

str = 'acacacbbbbddddacacacac';
trim = function (str, symbol) {
symbol = symbol ? symbol : ' ';
var array = str.split(symbol);
var sstr = array.shift();
var estr = array.pop();
while (sstr == "") {
sstr = array.shift();
}
while (estr == "") {
estr = array.pop();
}
var tmp = estr && sstr ? symbol : '';
if (array.length) {
tmp = symbol+array.join(symbol)+symbol;
return sstr+tmp+estr;
}
return sstr+tmp+(estr ? estr : '');
};
t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(trim(str, 'ac'));
trace(getTimer()-t); // 658

iNils
19.04.2007, 14:02
Измерь :)
trims = function (str, symbol) {
symbol = symbol ? symbol : ' ';
var array = str.split (symbol);
var sstr = array.shift ();
var estr = array.pop ();
while (estr == "") {
estr = array.pop ();
}
while (sstr == "") {
sstr = array.shift ();
}
var tmp = estr && sstr ? symbol : '';
if (array.length) {
tmp = symbol + array.join (symbol) + symbol;
return sstr + tmp + estr;
}
return sstr + tmp + (estr ? estr : '');
};

etc
19.04.2007, 14:06
Тогда уж:
str = 'acacacbbbbddddacacacac';
trim = function (str, symbol) {
symbol = symbol ? symbol : ' ';
var array = str.split(symbol);
var estr = array.pop();
var sstr = array.shift();
while (estr == "") {
estr = array.pop();
}
while (sstr == "") {
sstr = array.shift();
}
if (array.length) {
return sstr+symbol+array.join(symbol)+symbol+estr;
}
return (sstr && estr ? sstr+symbol+estr : (estr ? estr : ''));
};
t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(trim(str, 'ac'));
trace(getTimer()-t); // 580—610

iNils
19.04.2007, 14:13
Если кто-то еще следит, за тем как мы ерундой вдвоем страдаем :D и кто не понял, что нового в последних двух постах, объясняю: мы поменяли местами pop и shift. То есть сначала убрали символы с конца, а потом сначала и это дало результат :D

etc
19.04.2007, 14:14
Да, я ещё убрал лишнюю проверку и ещё 20 мс выцепил.

Kikasso
19.04.2007, 14:36
А кто будет переводы строк вырезать?
function trim(s:String):String{
if( s==undefined || s=="" ) return "" ;
var mx:Number, i:Number;
for ( mx = s.length-1; mx > 0; mx--) if ( s.charCodeAt(mx) > 32) break;
for (i = 1; i < mx; i++) if (s.charCodeAt(i) > 32) break;
return s.slice(i, mx+1);
}

trace (">>" + trim( " \n\taassddfegkl\t\t \n ")+ "<<");

473 ms ваша проверка показала (на строчке без пробелов)
с пробелами ессно больше

iNils
19.04.2007, 14:38
Этого в условии не было.

etc
19.04.2007, 14:39
Ну это правильный trim, в принципе.

iNils
19.04.2007, 14:46
Ну это правильный trim, в принципе.Я вообще до сегодняшнего дня об этом не слышал. А Kikasso схитрил, он только пробелы да перевод строк убрал, а у нас задача убрать любую последовательность символов с обоих концов.

Kikasso
19.04.2007, 14:52
А что trim должен делать? Обрезать все пробельные символы, насколько я понимаю. В php это именно так.

etc
19.04.2007, 14:57
У нас не совсем trim вышел. Ничего не мешает вызвать N раз наш чудо-trim с разными пробельными символами. Благо оптимизировано по самое нимагу :D

AlexSol
19.04.2007, 14:57
в php это так если не указан дополнительный параметр, задающий удаляемые символы.

Kikasso
19.04.2007, 15:26
function trim(s:String, delims:String):String{
if( s==undefined || s=="" ) return "" ;
var mx:Number, i:Number;
if( arguments.length == 1 ){
for ( mx = s.length-1; mx > 0; mx--) if ( s.charCodeAt(mx) > 32) break;
for (i = 1; i < mx; i++) if (s.charCodeAt(i) > 32) break;
return s.slice(i, mx+1);
}else{
for ( mx = s.length-1; mx > 0; mx--) if ( delims.indexOf(s.charAt(mx)) == -1 ) break;
for (i = 1; i < mx; i++) if (delims.indexOf(s.charAt(i)) == -1 ) break;
return s.slice(i, mx+1);
}
}

trace (">>" + trim( " \n\tsometext \t\n")+ "<<");
trace (">>" + trim( " \n\tsometext \t\n", " ")+ "<<");
trace (">>" + trim( " \n\tsometext \t\n", " \n")+ "<<");
trace (">>" + trim( " \n\tsometext \t\n", " \t\n")+ "<<");
trace (">>" + trim( " \n\tsometext \t\n", "s \t\n")+ "<<");
скорость не буду замерять.

etc
19.04.2007, 15:37
Я бы поостерегся называть переменную, как «mx». В данном случае она локальная и сбоев при использовании макромедийных классов не вызовет, но все же.

Kikasso
19.04.2007, 15:47
Да, нехорошо получилось ))
var mx = "не вижу проблемы";
trace(mx);//не вижу проблемы

etc
19.04.2007, 15:59
import mx.controls.Label;
mx = 'test';
trace(Label);

Ошибка:

**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 2: Type mismatch in assignment statement: found String where is required.
mx = 'test';

Total ActionScript Errors: 1 Reported Errors: 1



А так:
import mx.controls.Label;
var mx = 'test';
trace(Label); // undefined

iNils
19.04.2007, 16:10
Денис, применительно к нашему мег-триму :) если количество удаляемых строк велико, то быстрее будет работать такая схема:
pop
reverse
pop
reverse

Kikasso
19.04.2007, 16:21
**Error**
А, точно. Он же mx в _global загоняет..

iNils
19.04.2007, 16:30
Давайте все же условия обозначим, а то какждый о своем. Если брать за основу пхп, то условия должны быть такими:

trim (str:String [, charlist:String] ): String

Эта функция возвращает строку str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:

" " (ASCII 32 (0x20)), символ пробела.
"\t" (ASCII 9 (0x09)), символ табуляции.
"\n" (ASCII 10 (0x0A)), символ перевода строки.
"\r" (ASCII 13 (0x0D)), символ возврата каретки.
"\0" (ASCII 0 (0x00)), NUL-байт. - у нас такого нет
"\x0B" (ASCII 11 (0x0B)), вертикальная табуляция - про это не знаю.

Можно также задать список символов для удаления с помощью аргумента charlist. С помощью .. можно задать диапазон символовТо есть нельзя задать сочетания символов, а только их набор, последовательность роли не играет.

Kikasso
19.04.2007, 16:55
function trim(s:String, delims:String):String{
if( s==undefined || s=="" ) return "" ;
if (arguments.length == 1) delims = " \r\n\t";
var z:Number, i:Number;
for ( z = s.length-1; z > 0; z--) if ( delims.indexOf(s.charAt(z)) == -1 ) break;
for (i = 1; i < z; i++) if (delims.indexOf(s.charAt(i)) == -1 ) break;
return s.slice(i, z+1);
}
str = 'acacacbbbbddddacacacac';

t = getTimer();
for (var i = 0; i<10000; i++) {
trim(str, 'ac');
}
trace(trim(str, 'ac'));
trace(getTimer()-t); // 3393 Увы, медленно.

etc
19.04.2007, 16:59
Денис, применительно к нашему мег-триму :) если количество удаляемых строк велико, то быстрее будет работать такая схема:
pop
reverse
pop
reverse
Не уверен, что reverse+pop сработает быстрее, чем shift.
Проверять лень, работа давно стоит :D

OracleN
20.04.2007, 12:31
Есть еще вариант ускорить процесс до неузноваемости - кешировать результат. Т.е. создать массив куда сбрасывать отработанные результаты и при их повторной обработке брать оттуда.

При обработке одинаковых результатов - даст неимоверный выигрыш

etc
20.04.2007, 12:52
В одном из примеров кода, где 82 мс времени так и было сделано.

OracleN
20.04.2007, 12:54
Ммм, сорри, не до конца изучил.. Но вообще так нормально получилось, целый дипломный проект о функции. :D

etc
20.04.2007, 13:11
Кому поиграться, а кому — дипломный проект :D

Kikasso
20.04.2007, 13:16
При обработке одинаковых результатов - даст неимоверный выигрыш
Прикладное назначение этй функции - обрезать пробельные символы перед отправкой формы, чтобы не получить пустых сообщений, например, в гостевой. Вряд ли там будут одинаковые аргументы.. Да и не видел я доселе формы с 10000 полями))

OracleN
20.04.2007, 13:34
Прикладное назначение этй функции - обрезать пробельные символы перед отправкой формы, чтобы не получить пустых сообщений, например, в гостевой. Вряд ли там будут одинаковые аргументы.. Да и не видел я доселе формы с 10000 полями))

Полностью не солгасен с прикладным назначение. Вообще я уверен что редко кто знанимается ОБРЕЗАНИЕМ пробелов перед отправкой формыю

Kikasso
20.04.2007, 13:51
Я обрезаю любые данные перед отправкой, а уж на сервере само собой.
Хотите получить пустые строки в гостевой - не обрезайте, ваше дело. Не обрезанием, а обрезкой.

iNils
20.04.2007, 13:54
Если все отправляется на сервер, то можно там обрезать пхпешным trim, если же вводимые данные используются в самом флеше, тогда придется флешом резать.

Kikasso
20.04.2007, 14:09
Ну а проверить форму перед отправкой? Простите, вы ничего не ввели в поле для сообщения?
Туда-сюда пробелы гонять?
На сервере разумеется еще раз подрезать, просто на всякий случай.

iNils
20.04.2007, 14:23
Какая разница, что придет " " (<--- тут много пробелов) или "1111111111111111"? Тогда уж надо делать полную проверку на валидность.

Kikasso
20.04.2007, 14:36
Полная проверка на валидность невозможна. Если человек захочет написать ахинею, он ее напишет. Но пустоты не будет.
Другая ситуация: регистрируем человека, человек вводит пароль. Пароль криптуется, в смысле мдпятится, и отправляется уже в таком виде. Сервак ничего не сможет тут оттримить, обрезать надо перед отправкой. Если человек придумал себе пароль "1111111", это уже к доктору.
Третья ситуация: формируется xml и отправляется.

iNils
20.04.2007, 14:45
Отлично. Человек ввел пароль с пробелом, а ты их автоматом обрезал и сохранил пароль. Тут надо проверять на стадии ввода.

Kikasso
20.04.2007, 14:55
Пробелы ДО и ПОСЛЕ. Тут проверять не надо, есть restrict - пробелам и русским буквам в поле для паролей вообще делать нечего.
Но если на важный вопрос, который может содержать пробелы, ну название страны например, человек напишет два табулятора и перевод строки, мне не понадобится ответ сервера - строчка просто мигнет красным.

iNils
20.04.2007, 15:10
Но если на важный вопрос, который может содержать пробелы, ну название страны например, человек напишет два табулятора и перевод строки, мне не понадобится ответ сервера - строчка просто мигнет красным.
А теперь читаем, что я писал ранее
если же вводимые данные используются в самом флеше, тогда придется флешом резать.

iNils
20.04.2007, 20:29
Полный аналог (вроде бы полный:)) пхпешного трима
function trimPhp (str:String, charlist:String):String {
if (str.length) {
var array:Array = new Array ();
if (!charlist.length) {
charlist = " \t\n\r\x0B";
}
charlist = new String (charlist);
var f:Number = null;
var s:Number = null;
var e:Number = null;
while ((f = charlist.lastIndexOf ("..")) && f > -1) {
s = charlist.charCodeAt (f - 1);
e = charlist.charCodeAt (f + 2);
if (s > e) {
return ("Invalid '..'-range");
} else {
for (var i:Number = s; i <= e; i++) {
array[String.fromCharCode (i)] = true;
}
charlist = charlist.slice (0, f - 1) + charlist.slice (f + 3, charlist.length);
}
}
var a:Array = charlist.split ("");
for (var i:Number = 0; i < a.length; i++) {
array[a[i]] = true;
}
str = new String (str);
var sx:Number = 0;
var ex:Number = str.length;
while (array[str.charAt (sx)]) {
sx++;
}
while (array[str.charAt (ex - 1)]) {
ex--;
}
str = str.substring (sx, ex);
return str;
}
return null;
}
var str1:String = "\t \n \t \r abcdefg \r\t ";
var str2:String = "1 2 3 \t \n \t \r 4 abcdefg 5 \t \r 6 7 8 ";
var str3:String = "1_2_3_abcdefg_6_7_8";
var str4:String = "\t\t, 1273456. ... 132 ";
trace (">>>" + trimPhp () + "<<<");
trace (">>>" + trimPhp ("") + "<<<");
trace ("--------------------------------");
trace (">>>" + trimPhp (str1) + "<<<");
trace ("abcdefg" == trimPhp (str1));
trace ("--------------------------------");
trace (">>>" + trimPhp (str2, "\t\n\r1..3 6..8") + "<<<");
trace ("4 abcdefg 5" == trimPhp (str2, "\t\n\r1..3 6..8"));
trace ("--------------------------------");
trace (trimPhp (str3, "1..3_6..8"));
trace ("abcdefg" == trimPhp (str3, "1..3_6..8"));
trace ("--------------------------------");
trace (">>>" + trimPhp (str3, " \t 9...4") + "<<<");
trace (", 1273456" == trimPhp (str4, " \t 9...4"));

Kikasso
20.04.2007, 21:16
На пустой строке возвращает null - это правильно?
PS> я забыл, о чем мы спорили.
PSS> и какой-то array у вас странный, больше смахивает на Object ))

Kikasso
20.04.2007, 22:15
upd:
Отработан баг: при ".." в начале или конце charlist из while не было выхода, комп вис.
function trimPhp(str:String, charlist:String):String {
var delims:String = "";
if (typeof (str) != "string") {
return null;
}
if (!str.length) {
return "";
}
if (!charlist.length) {
delims = " \t\n\r\x0B";
} else {
var f:Number = null;
var s:Number = null;
var e:Number = null;
while ((f=charlist.lastIndexOf("..")) && f > 0) {
if(f==0 || f==charlist.length-2) return("Invalid '..'-range");
s = charlist.charCodeAt(f-1);
e = charlist.charCodeAt(f+2);
if (s>e) {
return ("Invalid '..'-range");
} else {
for (var i:Number = s; i<=e; i++) {
delims += String.fromCharCode(i);
}
charlist = charlist.slice(0, f-1)+charlist.slice(f+3, charlist.length);
}
}
}
delims += charlist;
var sx:Number = 0;
var ex:Number = str.length;
while (delims.indexOf(str.charAt(sx)) != -1) {
sx++;
}
while (delims.indexOf(str.charAt(ex-1)) != -1) {
ex--;
}
return str.substring(sx, ex);
}
var str1:String = "\t \n \t \r abcdefg \r\t ";
var str2:String = "1 2 3 \t \n \t \r 4 abcdefg 5 \t \r 6 7 8 ";
var str3:String = "1_2_3_abcdefg_6_7_8";
var str4:String = "\t\t, 1273456. ... 132 ";
trace(">>>"+trimPhp()+"<<<");
trace(">>>"+trimPhp("")+"<<<");
trace("--------------------------------");
trace(">>>"+trimPhp(str1)+"<<<");
trace("abcdefg" == trimPhp(str1));
trace("--------------------------------");
trace(">>>"+trimPhp(str2, "\t\n\r1..3 6..8")+"<<<");
trace("4 abcdefg 5" == trimPhp(str2, "\t\n\r1..3 6..8"));
trace("--------------------------------");
trace(">>>"+trimPhp(str3, "3_6..8..")+"<<<");
trace("abcdefg" == trimPhp(str3, "1..3_6..8"));
trace("--------------------------------");
trace(">>>"+trimPhp(str4, " \t 9...4..")+"<<<");
trace(", 1273456" == trimPhp(str4, " \t 9...4"));

iNils
21.04.2007, 00:22
На пустой строке возвращает null - это правильно?
PS> я забыл, о чем мы спорили.
PSS> и какой-то array у вас странный, больше смахивает на Object ))
1. Можно и саму строку возвращать, но пока я поставил null, чтобы было понятно, что ничего не изменилось.
3. Ассоциативный массив :)
upd:
Отработан баг: при ".." в начале или конце charlist из while не было выхода, комп вис.
Это хорошо, все варианты слету самому сложно охватить. Спасибо :)

Kikasso
21.04.2007, 00:33
3. Ассоциативный массив :)
Кстати ассотиативный Number тоже работает..

Мне если честно вот это место непонятно:
str = new String (str);

iNils
21.04.2007, 00:42
Кстати ассотиативный Number тоже работает..

Мне если честно вот это место непонятно:
str = new String (str);
1. Чего?:)
2. Работа со стрингом-объектом быстрее, чем с переменной типа стриг.

Kikasso
21.04.2007, 00:49
1) var array:Number = new Number ();
вместо Array()
и далее ваш код без изменений

А если вообще не создавать "объект правды", а использовать имеющийся str, получим небольшой выигрыш в скорости. Правда, __etc ругаться будет.