2013-11-14 5 views
2

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

function toTitleCase(str){ 
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
} 

Это работает, но мне нужно добавить исключения к этому, все значения, находящиеся в массиве: [США, США, 7UP, PC, Slimfast ...]

Эти значения иногда являются верхними, иногда более низкими, иногда смешанными и не нуждаются в изменении. Есть идеи?

+0

Что об использовании белого списка массива? Если 'txt' существует в массиве, возвращайтесь, не делая ничего. – Jon

+0

@ h2ooooooo: Я должен был написать 'txt' вместо' str'. Исправлено. – Jon

+0

Вы можете избежать использования 'charAt' и' substr': 's.replace (/ (\ w) (\ S *)/g, function (m, a, b) {return a.toUpperCase() + b .toLowerCase();}); '. – leaf

ответ

1

Решено использовать следующую функцию.

function toTitleCase(str){ 
     return str.replace(/\w\S*/g, function(txt){ 
     if(['PC','USA','U.S.A'].includes(txt))===-1){ 
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 
     } else { 
      return txt; 
     } 
     }); 
    } 

name = toTitleCase(name); 
+0

вы разрушили свой ответ с помощью _.indexOf – Michal

+1

lol, ok, fair point, редактирование – xShirase

+0

спасибо за усилие :) – Michal

2

Что о чем-то вдоль линий этого:

function toTitleCase(str){ 
    var ignore = inArray(exceptionsArr, str); 
    if (!ignore) { 
     return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
    } 
    return str; 
} 


inArray: function(arr, obj) { 
    return (arr.indexOf(obj) != -1); 
}, 

В качестве альтернативы, если ваша ул целая фраза, за исключением слов внутри него, вы можете разделить ул на отдельные слова, а затем запустить каждое слово через выше процесса с циклом for.

+0

FYI: 'indexOf' в массиве был сначала добавлен в IE9. – h2ooooooo

1
function toTitleCase(str){ 
    var cantTouchThis = {'USA' : 1, 'U.S.A' : 1, '7UP' : 1, 'PC' : 1, 'SLIMFAST' : 1}; 
    return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] ? txt : txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
} 

клавиш верхний регистр строка, которые вы не хотите, чтобы заменить

значение может быть все, что имеет значение true


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

function toTitleCase(str){ 
    var cantTouchThis = {'USA' : 'USA', 'U.S.A' : 'USA', '7UP' : '7Up', 'PC' : 'PC', 'SLIMFAST' : 'SlimFast'}; 
    return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] || txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
} 

таким образом строка как:

UsA U.S.A anything slimfast

станут:

USA USA Anything SlimFast

+0

cantTouchThis .. хорошо .. +1 –

0

EDIT: Кажется, я не совсем понимаю, что исключение составляют целые слова. В приведенном ниже ответе рассматриваются исключения, являющиеся частью этих слов.

Я не особо уверен, что это лучшее решение, но вы можете получить массив совпадений с вашими исключениями, а затем запустить свою функцию, а затем заменить спички назад.

var exceptions = ['USA','U\.S\.A','7UP','PC','SlimFast']; //escaped strings! 

var matcher = new RegExp(exceptions.join('|'), 'gi'); 

var str = 'tuSalolpCOKyes'; //test string 

var matches = str.match(matcher); // extract replacements 


var str = toTitleCase(str); // run your function 

// replace stuff you didn't want changed 
var index = 0; 
var str = str.replace(matcher, function() { 
    return matches[index++]; 
}); 

console.log(str); // RESULT: TuSalolpCokyes 


// your function 
function toTitleCase(str){ 
    return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 
} 
1

Это может быть именно то, что вам нужно, но общая идея:

  1. Split/предназначаться каждое слово.
  2. Проверьте, если он не соответствует ни слова в списке игнорируемых (используя i флаг игнорировать капитализации)
  3. Если это не так, капитализировать его,
  4. Если это, оставить его в покое.
var s = "UsA bar U.S.A. fOO slimfast bAz", 
    ignore = ["USA", "U.S.A", "7UP", "PC", "SlimFast"], 
    regex = new RegExp(ignore.join("|"), 'i'), 

    result = s.split(' ').map(function(word){ 
     return (regex.test(word)) ? word : capitalize(word); 
    }).join(' '); 

// "UsA Bar U.S.A. Foo slimfast Baz" 

function capitalize(s) { 
    return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); 
} 
Смежные вопросы