Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > большую строку разбить на маленькие


Автор: Samotnik 14.1.2010, 19:44
привет, подскажите пажалста smile
Есть строка 
VeryVeryLongStringInTheWorldWowSoSuschLongStringYYYyyeeeeahVeryLong
нужно из нее сделать маленькие строчечки в столбик по где-то 15 символов smile т.е. грубо говоря, нужно подобовлять в эту строку через каждые 15 символов  \n наверное smile 

Автор: Samotnik 14.1.2010, 20:10
сделал так smile 
Может другие варианты будут ? 
Код

 var count = 0;
    var digital = 18;
    var finalName = "";
    if (imageName.length <= digital) {
        return imageName;
    }
    else {
        var countTo = imageName.length % digital != 0 ? imageName.length % digital + 1 : imageName.length % digital;
        for (var i = 0; i < countTo; i++) {
            finalName += imageName.substr(count, digital) + "\n";
            count += digital;
        }
        return finalName;
    }

где, imageName - та большущая строка smile 
Может не верный алгоритм ?  Но вродь пока работает smile 

Автор: Amphiluke 14.1.2010, 21:43
Чтобы не заботиться о длине копируемого фрагмента, вместо substr можно пользоваться slice.
Код

    var str = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345";
    var charsPerLine = 18;
    var lineCount = Math.ceil(str.length / charsPerLine);
    var lines = "";
    for (var i = 0; i < lineCount; i++) {
        lines += str.slice(i * charsPerLine, i * charsPerLine + charsPerLine) + "\n";
    }
    alert(lines);


Добавлено через 5 минут и 51 секунду
Впрочем, всё одно…

Автор: 12345c 15.1.2010, 12:07
Можно по-разному, но самое краткое и очевидное, видимо
Код

imageName = imageName.replace(/(.{15})/g, "$1\n");

(если столбик html, то <br> вместо \n; если массив для дальнейших действий, то imageName.match(/(.{15})/g) )

Автор: Samotnik 15.1.2010, 12:39
12345c,  smile  пасибо круто smile  
и цикл не нужен smile

Добавлено через 9 минут
12345c, а как вместо 15   переменную подставить ? 
Код

 this.digital = 17;
    if (imageName.length <= this.digital) {
        return imageName;
    }
    else return imageName.replace(/(.{this.digital})/g, "$1\n");

вот так не работает (( 

Автор: 12345c 15.1.2010, 14:09
Код

.replace(RegExp("(.{"+this.digital+"})","g"), "$1\n")

Автор: Samotnik 15.1.2010, 14:13
12345c, круто конечно, спасибо. Обьясни пажалста smile  Как это и почему работает ? 

Автор: 12345c 15.1.2010, 14:15
или то, что выше, в 1 строчку

Код

return imageName.replace(RegExp("(.{"+Math.min(this.digital, imageName.length+1)+"})","g"), "$1\n");


Добавлено через 1 минуту и 2 секунды
Так документацию по рег.выражениям читайте. Полезно знать.

Автор: Samotnik 15.1.2010, 14:24
12345c, хорошо, спасибо. Сейчас, строку в 100 символов оно выводит по 20 символов, т.е. в 5 строк. 
А, если, мне нужно это ограничить ? И вывести, скажем 2 строки, а остальное просто дописать ...
 Есть такое решение ? 

Автор: 12345c 15.1.2010, 14:37
Цитата(Samotnik @  15.1.2010,  14:24 Найти цитируемый пост)
а остальное просто дописать
кто будет дописывать? smile Мы же о скриптах говорим? Если дописываемый текст в s, то можно тем же регекспом обработать дальше.


Код

return imageName.replace(RegExp("(.{"+Math.min(this.digital, imageName.length+1)+"})","g"), "$1\n")
  .replace(/(.{42}).*/, "$1<!replaced!>").replace("<!replaced!>$", s);

 //последнее - на случай, если $1 будет в тексте s, иначе просто .replace(/(.{42}).*/, "$1"+s)

Автор: Samotnik 15.1.2010, 14:40
12345c,  а что  такое  s ?

Добавлено через 3 минуты и 14 секунд
и еще, мне колличество строк нужно задавать константой smile В самом начле файла.  Ну т.е. оно в перспективе будет выставлятся в настройках приложения. А сейчас просто пока для работы нужно выставлять константой в самом коде.

Добавлено через 10 минут и 12 секунд
не работает. Пишет, что s is not defined

Автор: 12345c 15.1.2010, 19:03
Цитата(12345c @  15.1.2010,  14:37 Найти цитируемый пост)
Если дописываемый текст в s, то 
 s - дописываемый текст.

Автор: Samotnik 15.1.2010, 19:19
12345c, да, я уже разобрался, спасибо, а подскажи пажалста как вот сюда
Код

.replace(/(.{42}).*/, "$1<!replaced!>")

вставить переменную, вместо числа 42 ?   smile

Добавлено через 13 минут и 50 секунд
Код

var  test = 75;
.replace(/(.{test}).*/, "$1<!replaced!>")

не работает  smile 

Автор: 12345c 15.1.2010, 19:41
Samotnik, ну вы что, совсем думать не умеете? smile 42  - это 2 по 20 + 2 символа переносов строки.

... А понял, вопрос тоже от незнания объекта RegExp.
http://inf.tltsu.ru/res/strogov/books/js/JavaScript/RegExpJS.html
Цитата

Функция конструктора используется так:

new RegExp("pattern"[, "flags"])

Параметры:

pattern - Текст регулярного выражения.

flags - Флаг, если специфицирован, может иметь следующие значения в любом сочетании:

    * g: глобальная подстановка
    * i: игнорировать регистр
    * m: подставлять на нескольких строках

Заметьте, что параметры литерального формата не используют кавычек для обозначения строк, а параметры функции конструктора - используют кавычки. Итак, следующие выражения создают одно и то же регулярное выражение:

/ab+c/i
new RegExp("ab+c", "i")
(Общий совет такой: видите в ответе или примере незнакомое, но важное слово (RegExp) - ищИте его в инете вместе с контекстом (javascript). Через 2 минуты все объяснения под рукой.)

Т.е.
Код

.replace(RegExp("(.{" + nStrok*21 + "}).*"), "$1<!replaced!>")

Автор: Samotnik 16.1.2010, 12:09
12345c, спасибо !  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)