Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Заменить все символы после 5-го на звездочки (https://javascript.ru/forum/misc/56142-zamenit-vse-simvoly-posle-5-go-na-zvezdochki.html)

Shitbox2 01.06.2015 13:21

Заменить все символы после 5-го на звездочки
 
Нужно заменять в словах символы после 5-го на звездочки

Не путайте Яндекс.Деньги с Гоголь-Моголем
Не путай** Яндек*.Деньг* с Гогол*-Могол**

Как это сделать проще?

рони 01.06.2015 13:32

Shitbox2,
:) str.replace

рони 01.06.2015 13:50

Shitbox2,
var str = "Не путайте Яндекс.Деньги с Гоголь-Моголем";
str = str.replace(/([-\s.]?\S{5})(\S+?)(?=[-\s.]|$)/g, function(a, b, c) {
    return b + c.replace(/./g, "*")
})
alert(str)

Shitbox2 01.06.2015 14:26

рони, хороший вариант. Но это первое, что приходит в голову :-) Не читаем, да и работает не быстро.

Придумал такой, но захардкоженная строка с 30 звездочками не очень нравится.

var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';

str = str.replace(/[\wа-яёА-ЯЁ]+/g, function(word) {  
    return word.substring(0, 5) + '******************************'.substring(0, word.length - 5);
})
alert(str);

рони 01.06.2015 14:48

Shitbox2,
var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';

str = str.replace(/[\wа-яёА-ЯЁ]+/g, function(word) {
    var len = word.length - 5;
    return word.substring(0, 5) +  (len > 0 ? (new Array(len+1)).join('*') : '') ;
})
alert(str);

nerv_ 01.06.2015 15:15

зависит от того, что словом считать
var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';

str = str.replace(/[^-.\s]{5}([^-.\s]+)/g, function(word) {
    return word.slice(0, 5) + new Array(word.length - 4).join('*');
})
alert(str);

var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';

str = str.replace(/([^-.\s]{5})([^-.\s]+)/g, function(word, found1, found2) {
    return found1 + new Array(found2.length + 1).join('*');
})
alert(str);

Shitbox2 01.06.2015 16:37

Больше нравится вариант с разделением на слова, т.к. позволяет разнести логику. Одна часть делит предложение, другая — обрабатывает слова. Напрягает только проверка len > 0 ? ..., но от нее, наверное, никуда не деться.

function asteriskify(word, letters, type) {
    type = type || '*';

    var asteriskesNumber = word.length - Math.abs(letters);
    var asteriskes       = (asteriskesNumber > 0 ? (new Array(asteriskesNumber + 1)).join(type) : '');

    if (letters > 0) {
        return word.substring(0, letters) + asteriskes;
    } else {
        return asteriskes + word.substring(word.length + letters, word.length)
    }
}

var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';
var REGEXP = /[\wа-яёА-ЯЁ]+/g;

var out1 = str.replace(REGEXP, function(word) {
    return asteriskify(word, 5);
})

var out2 = str.replace(REGEXP, function(word) {
    return asteriskify(word, -4);
})

alert(out1 +'\n'+ out2)

sexbot 01.06.2015 19:07

Ну для начала нужно разбить текст на слова. Хорошая регулярках в исходниках редактора Sublime Text

// Characters that are considered to separate words
    "word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?",


Конечно она не учитывает специфические знаки пунктуации типа "¿¡"

Но там по-ходу перечислены тупо все символы пунктуации на клаве:

var wordsSplitRe = /[\s`~!@#$%^&*()-_+=|\\[\]{};:"',<.>?\/]+/;
'*уй *изда джигурда'.split(wordsSplitRe); // ["", "уй", "изда", "джигурда"]


А затем отдельные слова обрабатываем

sexbot 01.06.2015 19:07

var str = 'Не путайте Яндекс.Деньги с Гоголь-Моголем';

str = str.replace(/[^\s`~!@#$%^&*()-_+=|\\[\]{};:"',<.>?\/]+/g, function(word) {
    var len = word.length - 5;
    return word.substring(0, 5) + (len > 0 ? Array(++len).join('*') : '');
})

"Не путай** Яндек*.Деньг* с Гогол*-Могол**"

indeterm 01.06.2015 22:06

Цитата:

Сообщение от sexbot
/[^\s`~!@#$%^&*()-_+=|\\[\]{};:"',<.>?\/]+/g

Это почти то же самое, что
/[\wа-яё]+/gi


вот так можно
alert(
 'Не путайте Яндекс.Деньги с Гоголь-Моголем'
  .replace(/[\wа-яё]+/gi, function(word){
    return word.substring(0, 5)+word.substring(5).replace(/./g, "*")})
)

А нижний пробел обычно входит в число обычных символов.


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