2017-01-26 6 views
1

Как заменить все пробелы на  , но не на первый (первый после пробела).JavaScript/jQuery: заменить 2-е, 3-е и т. Д. Пространства на  , но не на первое в тексте

В качестве примера, эта строка:

var str = "hello  how are you doing? " 

должен быть изменен на

"hello     how are you    doing?  " 

Как вы видите, сохраняется первое пространство.

В качестве примера,

str.split(' ').join(' ') 

заменит все ' ' с  .

ответ

1
str.replace(/ +/g, function(match) { 
    return " " + Array(match.length).join(' '); 
}); 

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

Функция String.prototype.repeat, но она не поддерживается в IE, поэтому вы можете использовать альтернативный способ генерации последовательности  . Array(match.length).join(' ') - это короткий способ повторить строку, взятую из this answer, на другой вопрос.

В качестве альтернативы вы можете использовать эту функцию, чтобы выполнить повтор, снова берется из Repeat String вопроса:

function repeat(pattern, count) { 
    if (count < 1) return ''; 
    var result = ''; 
    while (count > 1) { 
     if (count & 1) result += pattern; 
     count >>= 1, pattern += pattern; 
    } 
    return result + pattern; 
} 

Уведомление с Array(n).join вам не нужно вычесть 1 из длины чтобы получить нужное количество неразрывных пробелов. например Array(3).join('&nbsp;') - "&nbsp;&nbsp;", но для других подходов к генерации повторяющейся строки вам понадобится 1 меньше длины совпадения.

2

Эта функция будет делать это

function myFunction() { 
      var str = "hello  how are you doing? "; 
      var patt1 = /\s{2,}/g; 
      var result = str.replace(patt1,function(filtered){ 
       return " " + Array(filtered.length).join('&nbsp;') 
      })); 
      document.getElementById("demo").innerHTML = result; 
      console.log(result) 
} 

, но вы не увидите никакого влияния, так как я пишу документ , но если вы пишете в консоли вы обязательно увидите аффект

редактировать-1 Благодаря mikej, который указал на ошибку в My code, мой маленький фрагмент на самом деле такой же, как и его. Его ответ более точный и имеет больше информации, чем представленные здесь,

answer By mikej

+0

Не заменит ли более чем 2 пробела пробелом, за которым следует только один « » вместо того, чтобы заменять каждое пространство * после * первым с помощью « »? – mikej

+1

да, это будет, извините, не заметили, что :((В этом случае мне нужно его отредактировать. Спасибо за головы –

+0

, в этом случае я поеду с таким же кодом, как у вас с кредитами, я надеюсь ты не против –

1

Если вы хотите получить базовые, вы можете попробовать что-то вроде ниже, вдохновленное this answer, и комментария по Атешу Goral (отдельной функция полезности, а не расширять класс базовой строки). Должно работать во всех браузерах:

var str = "some words here"; 
var first = true; 
for (var i=0; i<str.length; i++) { 
    if (str[i] == " " && !first) { 
    str = fix(str, i, '\u00A0'); //insert unicode for &nbsp; 
    } else if (str[i] == " " && first) { 
    first = false; 
    } else if (str[i] != " ") { 
    first = true; 
    } 
} 

function fix(s, index, character) { 
    return s.substr(0, index) + character + s.substr(index+character.length); 
} 

Поскольку строки являются неизменными, вы должны вернуть полную (модифицированную) Строку каждый раз, когда вы вносите изменения, и поместить его в переменной str.

 Смежные вопросы

  • Нет связанных вопросов^_^