Просмотр полной версии : Trim функция в ActionScript
Господа, а не подскажете ли вы есть ли здесь trim функция (надеюсь ее назначение ясно) или надо самому создвать ее?
Варианты по этой функции уже были предложены на этом форуме, ищите
Варианты по этой функции уже были предложены на этом форуме, ищите
Сам решил написать, вот что получилось
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);
}
Сам решил написать, вот что получилось
Ужас. Вот метод работающий в 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 раз быстрее.
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
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;
}
Уверен?
Использовать здесь charAt - нельзя, ибо sumbol может быть равныа 'qw' или другим символам (не одному)
Ха.. этот метот убирает только пробелы, а предыдущий имеет возможность убрать любые символы.Ну __etc уже доказал, что это не так:)
И почему это в 20 раз быстрее. А не в 2 или даже не в 1.5Линейкой измерил :D Запустил обе функции в цикле 1000 раз и посмотрел время необходимое для реализации.
Да ну, всеравно символ должен быть с length = 1.
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'));
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. Т.е. особо ускорения я не могу здесь видеть.
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
Хе, я вас сделал, ибо мой НОВЫЙ метод считает в 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;
}
С оптимизацией моего кода:
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.
мой на своей машине прогони, должно меньше секунды у тебя считать.
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
Попробуй с оптимизацией моего, просто интересно, машины у нас разные.
мой на своей машине прогони, должно меньше секунды у тебя считать.
Не не меньше, гдето у меня в 1.3 раза
Ещё в 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
Ещё в 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 писал.
Подумаешь.
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);
Выжал ещё 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
Да клева, тут согласен что в 20 раз быстрее первоначального, хотя мне кажется нужно нормально потестить, бо к примеру если одну комбинацию надо убрать, то тут с массивами не быстрее будет, но надо тестить.
И ещё 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
Измерь :)
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 : '');
};
Тогда уж:
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
Если кто-то еще следит, за тем как мы ерундой вдвоем страдаем :D и кто не понял, что нового в последних двух постах, объясняю: мы поменяли местами pop и shift. То есть сначала убрали символы с конца, а потом сначала и это дало результат :D
Да, я ещё убрал лишнюю проверку и ещё 20 мс выцепил.
А кто будет переводы строк вырезать?
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 ваша проверка показала (на строчке без пробелов)
с пробелами ессно больше
Ну это правильный trim, в принципе.
Ну это правильный trim, в принципе.Я вообще до сегодняшнего дня об этом не слышал. А Kikasso схитрил, он только пробелы да перевод строк убрал, а у нас задача убрать любую последовательность символов с обоих концов.
А что trim должен делать? Обрезать все пробельные символы, насколько я понимаю. В php это именно так.
У нас не совсем trim вышел. Ничего не мешает вызвать N раз наш чудо-trim с разными пробельными символами. Благо оптимизировано по самое нимагу :D
в php это так если не указан дополнительный параметр, задающий удаляемые символы.
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")+ "<<");
скорость не буду замерять.
Я бы поостерегся называть переменную, как «mx». В данном случае она локальная и сбоев при использовании макромедийных классов не вызовет, но все же.
Да, нехорошо получилось ))
var mx = "не вижу проблемы";
trace(mx);//не вижу проблемы
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
Денис, применительно к нашему мег-триму :) если количество удаляемых строк велико, то быстрее будет работать такая схема:
pop
reverse
pop
reverse
**Error**
А, точно. Он же mx в _global загоняет..
Давайте все же условия обозначим, а то какждый о своем. Если брать за основу пхп, то условия должны быть такими:
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. С помощью .. можно задать диапазон символовТо есть нельзя задать сочетания символов, а только их набор, последовательность роли не играет.
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 Увы, медленно.
Денис, применительно к нашему мег-триму :) если количество удаляемых строк велико, то быстрее будет работать такая схема:
pop
reverse
pop
reverse
Не уверен, что reverse+pop сработает быстрее, чем shift.
Проверять лень, работа давно стоит :D
Есть еще вариант ускорить процесс до неузноваемости - кешировать результат. Т.е. создать массив куда сбрасывать отработанные результаты и при их повторной обработке брать оттуда.
При обработке одинаковых результатов - даст неимоверный выигрыш
В одном из примеров кода, где 82 мс времени так и было сделано.
Ммм, сорри, не до конца изучил.. Но вообще так нормально получилось, целый дипломный проект о функции. :D
Кому поиграться, а кому — дипломный проект :D
При обработке одинаковых результатов - даст неимоверный выигрыш
Прикладное назначение этй функции - обрезать пробельные символы перед отправкой формы, чтобы не получить пустых сообщений, например, в гостевой. Вряд ли там будут одинаковые аргументы.. Да и не видел я доселе формы с 10000 полями))
Прикладное назначение этй функции - обрезать пробельные символы перед отправкой формы, чтобы не получить пустых сообщений, например, в гостевой. Вряд ли там будут одинаковые аргументы.. Да и не видел я доселе формы с 10000 полями))
Полностью не солгасен с прикладным назначение. Вообще я уверен что редко кто знанимается ОБРЕЗАНИЕМ пробелов перед отправкой формыю
Я обрезаю любые данные перед отправкой, а уж на сервере само собой.
Хотите получить пустые строки в гостевой - не обрезайте, ваше дело. Не обрезанием, а обрезкой.
Если все отправляется на сервер, то можно там обрезать пхпешным trim, если же вводимые данные используются в самом флеше, тогда придется флешом резать.
Ну а проверить форму перед отправкой? Простите, вы ничего не ввели в поле для сообщения?
Туда-сюда пробелы гонять?
На сервере разумеется еще раз подрезать, просто на всякий случай.
Какая разница, что придет " " (<--- тут много пробелов) или "1111111111111111"? Тогда уж надо делать полную проверку на валидность.
Полная проверка на валидность невозможна. Если человек захочет написать ахинею, он ее напишет. Но пустоты не будет.
Другая ситуация: регистрируем человека, человек вводит пароль. Пароль криптуется, в смысле мдпятится, и отправляется уже в таком виде. Сервак ничего не сможет тут оттримить, обрезать надо перед отправкой. Если человек придумал себе пароль "1111111", это уже к доктору.
Третья ситуация: формируется xml и отправляется.
Отлично. Человек ввел пароль с пробелом, а ты их автоматом обрезал и сохранил пароль. Тут надо проверять на стадии ввода.
Пробелы ДО и ПОСЛЕ. Тут проверять не надо, есть restrict - пробелам и русским буквам в поле для паролей вообще делать нечего.
Но если на важный вопрос, который может содержать пробелы, ну название страны например, человек напишет два табулятора и перевод строки, мне не понадобится ответ сервера - строчка просто мигнет красным.
Но если на важный вопрос, который может содержать пробелы, ну название страны например, человек напишет два табулятора и перевод строки, мне не понадобится ответ сервера - строчка просто мигнет красным.
А теперь читаем, что я писал ранее
если же вводимые данные используются в самом флеше, тогда придется флешом резать.
Полный аналог (вроде бы полный:)) пхпешного трима
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"));
На пустой строке возвращает null - это правильно?
PS> я забыл, о чем мы спорили.
PSS> и какой-то array у вас странный, больше смахивает на Object ))
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"));
На пустой строке возвращает null - это правильно?
PS> я забыл, о чем мы спорили.
PSS> и какой-то array у вас странный, больше смахивает на Object ))
1. Можно и саму строку возвращать, но пока я поставил null, чтобы было понятно, что ничего не изменилось.
3. Ассоциативный массив :)
upd:
Отработан баг: при ".." в начале или конце charlist из while не было выхода, комп вис.
Это хорошо, все варианты слету самому сложно охватить. Спасибо :)
3. Ассоциативный массив :)
Кстати ассотиативный Number тоже работает..
Мне если честно вот это место непонятно:
str = new String (str);
Кстати ассотиативный Number тоже работает..
Мне если честно вот это место непонятно:
str = new String (str);
1. Чего?:)
2. Работа со стрингом-объектом быстрее, чем с переменной типа стриг.
1) var array:Number = new Number ();
вместо Array()
и далее ваш код без изменений
А если вообще не создавать "объект правды", а использовать имеющийся str, получим небольшой выигрыш в скорости. Правда, __etc ругаться будет.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.