Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена случайных пробелов на строку (https://javascript.ru/forum/misc/42872-zamena-sluchajjnykh-probelov-na-stroku.html)

BelOFF 12.11.2013 16:45

Замена случайных пробелов на строку
 
Добрый день любители и знатоки JS.

Не могу сообразить никак, как бы сделать одну фичу:

есть строка:

var s = 'Я люблю Москву всеми частями своего тела';


и есть строка замены

var p = '<a href="#"> cool </a>';


как можно заменить 2-3 случайных пробела в строке, что бы на выходе получить:

Я люблю<a href="#"> cool </a>Москву всеми частями<a href="#"> cool </a>своего тела


а при следующей перезагрузки страницы

Я<a href="#"> cool </a>люблю Москву<a href="#"> cool </a>всеми частями своего<a href="#"> cool </a>тела


т.е. случайно менять количество и расположение строки замены?

может кто-нить может помочь?

Faab 12.11.2013 16:50

ну подсчитай число пробелов в строке.. потом на основании этого числа поставь рандом , как и на количество пробелов, так и на их расположение.. а потом простая замена, на основании данных рандома.

BelOFF 12.11.2013 16:57

Цитата:

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

Да, было бы все так просто... я как-то не очень силен в JS...
Я не понимаю как можно заменить 3 и 5 пробелы...
Все пробелы без проблем... а вот конкретные...

Faab 12.11.2013 17:05

Работа со строками

функция рандом

Испытайте свои знания в освоении новых тем в JS, а если не получится, выложите то, что у вас не получается.

BelOFF 12.11.2013 18:37

Решил вопрос написав 2 функции

function replaceTXT(){
    var t = $('#content').html(), // выбираем html c текстом
        s = t.split(/[,]/g), // разбиваем на массив (в моем случае с каждой запятой ",")
        v = gen_rand(s.length), // отправляем количество элементов массива в ф-ю, которая вернет массив с номерами элементов, которые надо обработать
        txt = '<a href="#">Добавляемый текст</a> '; // строка которая будет добавляться
        
        for(var i = 0; i < v.length; i++){ // перебираем массив который нам сгенерировала ф-я  gen_rand
            s[v[i]] = txt + s[v[i]]; // добавляем в нужном элементе строку
        }
        s = s.join(); // воссоздаем html код обратно
        $('#content').html(s); // выводим код
}
function gen_rand(r){
    var z = 10, // максимально возможное кол-во элементов в создаваемом массиве
    d = r % Math.ceil(Math.random()*z); // генерируем случайное кол-во элементов 
    if (d < 1){ // если с первого раза не прокатило, повторяем
        gen_rand(r);
        return;
    }else{
        var arr = new Array();
        for (var i=0; i <= d; i++)
            arr[i] = Math.floor(Math.random()*r); // создаем массив со случайными индексами основного массива
    }
    return arr;
}


Faab Спасибо за настояние :)

Deff 13.11.2013 00:44

var s = 'Я люблю Москву всеми частями своего тела';
var arr = s.split(/\s+/g),lng = arr.length;
var n = Math.floor(Math.random() *3+1);//число заменяемых пробелов;max = 3
var arr2=[];

function rand(n) {
  if(n<=0)return;
  var a= Math.floor(Math.random() *(lng-1));
  if(('='+arr2.join('=')+'=').indexOf('='+a+'=')!=-1){rand(n);return} //если номер пробела есть уже  в списке выбор повторяем;
  arr2.push(a);
  --n;
  rand(n);
} rand(n);

var s2='', tstStr = '='+arr2.join('=')+'=';
for (var i=0; i<lng; i++){
 var d = ' '; if(tstStr.indexOf('='+(i-1)+'=')!=-1) d = '<a href="#"> cool </a>';
 s2+=d + arr[i];
}
alert(['arr2='+arr2,'\n'+s2])


Хотя можно упростить, опустив пункт задания числа заменяемых пробелов;(их число будет меняться за счет случайного совпадений индексов)
var s = 'Я люблю Москву всеми частями своего тела';
var arr = s.split(/\s+/g),lng = arr.length;

var arr2=[];

function rand(n) {
  if(n<=0)return;
  var a= Math.floor(Math.random() *(lng-1));
  arr2.push(a);
  --n;
  rand(n);
} rand(3); //max = 3

var s2='', tstStr = '='+arr2.join('=')+'=';
for (var i=0; i<lng; i++){
 var d = ' '; if(tstStr.indexOf('='+(i-1)+'=')!=-1)d = '<a href="#"> cool </a>';
 s2+=d + arr[i];
}
alert(['arr2='+arr2,'\n'+s2])

BETEPAH 13.11.2013 01:31

Понравилась задача, решил поразмяться
var str = 'Я люблю Москву всеми частями своего тела';
var repeat = 10;
while(repeat--) console.log(getAdw(str, 2));

function getAdw(str, match) {
	str = str.split(' ');
	var arr = [];
	for (var i = 0; i < str.length ; i++) arr[i] = i;
	while(match--) str[arr.splice(Math.floor(Math.random() * (arr.length -1)), 1)] += ' <a href="#">cool</a>';
	return str.join(' ');
}

ksa 13.11.2013 08:52

Цитата:

Сообщение от BETEPAH
решил поразмяться

Результат твоей разминки
Я <a href="#">cool</a> люблю Москву всеми частями своего <a href="#">cool</a> тела

Пробелы нужно менять, а не вставлять в разные места означеный тег... ;)

BETEPAH 13.11.2013 10:19

ksa,
Ну, как "увидел" задачу, так и решил. Получил немного удовольствия, потому что хотел сделать отдельной функцией с настраиваемым количеством замен и без "если с первого раза не прокатило, повторяем". Теоретически (с очень-очень низкой вероятностью, но все же) эти повторы могут повесть браузер на какое-то время. Как-то некошерно это ;)

Deff 13.11.2013 13:57

Цитата:

Сообщение от ksa
Пробелы нужно менять, а не вставлять в разные места означеный тег...

Ну по идее вставка <a href="#"> cool</a> (один пробел перед cool) приводит к тому же видимому результату, что и замена пробела на авторский тег с <a href="#"> cool </a> двумя пробелами


Часовой пояс GMT +3, время: 04:58.