774 Stimmen

Zeichenkette mit JavaScript in Großbuchstaben umwandeln

Gibt es eine einfache Möglichkeit, eine Zeichenfolge in Title Case zu konvertieren? z.B.. john smith wird John Smith . Ich bin nicht auf der Suche nach etwas Kompliziertem wie Die Lösung von John Resig nur (hoffentlich) eine Art Ein- oder Zweizeiler.

1 Stimmen

Es gibt verschiedene Methoden, haben wir einige Leistungsstatistiken?

1 Stimmen

2 Stimmen

Wir schreiben das Jahr 2022, und die Browser verfügen immer noch nicht über eine native Funktion für diese Aufgabe.

21voto

Mike Punkte 417

Ohne Verwendung von Regex, nur als Hinweis:

String.prototype.toProperCase = function() {
  var words = this.split(' ');
  var results = [];
  for (var i = 0; i < words.length; i++) {
    var letter = words[i].charAt(0).toUpperCase();
    results.push(letter + words[i].slice(1));
  }
  return results.join(' ');
};

console.log(
  'john smith'.toProperCase()
)

0 Stimmen

Danke für die Regex-freie Lösung!

18voto

fncomp Punkte 5840

Falls Sie sich Sorgen um diese Füllwörter machen, können Sie der Funktion einfach sagen, was nicht großgeschrieben werden soll.

/**
 * @param String str The text to be converted to titleCase.
 * @param Array glue the words to leave in lowercase. 
 */
var titleCase = function(str, glue){
    glue = (glue) ? glue : ['of', 'for', 'and'];
    return str.replace(/(\w)(\w*)/g, function(_, i, r){
        var j = i.toUpperCase() + (r != null ? r : "");
        return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase();
    });
};

Ich hoffe, das hilft Ihnen weiter.

bearbeiten

Wenn Sie führende Leimwörter behandeln wollen, können Sie dies mit einer weiteren Variablen verfolgen:

var titleCase = function(str, glue){
    glue = !!glue ? glue : ['of', 'for', 'and', 'a'];
    var first = true;
    return str.replace(/(\w)(\w*)/g, function(_, i, r) {
        var j = i.toUpperCase() + (r != null ? r : '').toLowerCase();
        var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase();
        first = false;
        return result;
    });
};

2 Stimmen

Sie können eine Zeichenkette in ein Array zerlegen. Wir könnten also portugiesische, spanische, italienische und französische Präpositionen haben: glue ='de|da|del|dos|do|das|des|la|della|delli'.split('|');

0 Stimmen

Dadurch wird nicht sichergestellt, dass das erste Wort groß geschrieben wird, d. h. and another thing wird and Another Thing . Ich brauche nur eine elegante Methode, um das erste Wort immer groß zu schreiben.

0 Stimmen

@BradKoch - polstern Sie mit Leerzeichen auf, so dass Sie ' und ', ' de ', etc. als Suchwort verwenden, dann wird 'And Another And Another' durch 'And Another and Another' ersetzt.

17voto

dipole_moment Punkte 4156

Wenn Sie eine grammatikalisch korrekte Antwort benötigen:

Bei dieser Antwort werden Präpositionen wie "von", "aus", berücksichtigt. Die Ausgabe erzeugt einen Titel im redaktionellen Stil, wie man ihn in einer Zeitung erwarten würde.

toTitleCase Funktion

Die Funktion, die die Grammatikregeln berücksichtigt hier aufgelistet . Die Funktion konsolidiert auch Leerzeichen und entfernt Sonderzeichen (ändern Sie die Regex für Ihre Bedürfnisse)

const toTitleCase = (str) => {
  const articles = ['a', 'an', 'the'];
  const conjunctions = ['for', 'and', 'nor', 'but', 'or', 'yet', 'so'];
  const prepositions = [
    'with', 'at', 'from', 'into','upon', 'of', 'to', 'in', 'for',
    'on', 'by', 'like', 'over', 'plus', 'but', 'up', 'down', 'off', 'near'
  ];

  // The list of spacial characters can be tweaked here
  const replaceCharsWithSpace = (str) => str.replace(/[^0-9a-z&/\\]/gi, ' ').replace(/(\s\s+)/gi, ' ');
  const capitalizeFirstLetter = (str) => str.charAt(0).toUpperCase() + str.substr(1);
  const normalizeStr = (str) => str.toLowerCase().trim();
  const shouldCapitalize = (word, fullWordList, posWithinStr) => {
    if ((posWithinStr == 0) || (posWithinStr == fullWordList.length - 1)) {
      return true;
    }

    return !(articles.includes(word) || conjunctions.includes(word) || prepositions.includes(word));
  }

  str = replaceCharsWithSpace(str);
  str = normalizeStr(str);

  let words = str.split(' ');
  if (words.length <= 2) { // Strings less than 3 words long should always have first words capitalized
    words = words.map(w => capitalizeFirstLetter(w));
  }
  else {
    for (let i = 0; i < words.length; i++) {
      words[i] = (shouldCapitalize(words[i], words, i) ? capitalizeFirstLetter(words[i], words, i) : words[i]);
    }
  }

  return words.join(' ');
}

Unit-Tests zur Sicherstellung der Korrektheit

import { expect } from 'chai';
import { toTitleCase } from '../../src/lib/stringHelper';

describe('toTitleCase', () => {
  it('Capitalizes first letter of each word irrespective of articles, conjunctions or prepositions if string is no greater than two words long', function(){
    expect(toTitleCase('the dog')).to.equal('The Dog'); // Capitalize articles when only two words long
    expect(toTitleCase('for all')).to.equal('For All'); // Capitalize conjunctions when only two words long
    expect(toTitleCase('with cats')).to.equal('With Cats'); // Capitalize prepositions when only two words long
  });

  it('Always capitalize first and last words in a string irrespective of articles, conjunctions or prepositions', function(){
    expect(toTitleCase('the beautiful dog')).to.equal('The Beautiful Dog');
    expect(toTitleCase('for all the deadly ninjas, be it so')).to.equal('For All the Deadly Ninjas Be It So');
    expect(toTitleCase('with cats and dogs we are near')).to.equal('With Cats and Dogs We Are Near');
  });

  it('Replace special characters with space', function(){
    expect(toTitleCase('[wolves & lions]: be careful')).to.equal('Wolves & Lions Be Careful');
    expect(toTitleCase('wolves & lions, be careful')).to.equal('Wolves & Lions Be Careful');
  });

  it('Trim whitespace at beginning and end', function(){
    expect(toTitleCase(' mario & Luigi superstar saga ')).to.equal('Mario & Luigi Superstar Saga');
  });

  it('articles, conjunctions and prepositions should not be capitalized in strings of 3+ words', function(){
    expect(toTitleCase('The wolf and the lion: a tale of two like animals')).to.equal('The Wolf and the Lion a Tale of Two like Animals');
    expect(toTitleCase('the  three Musketeers  And plus ')).to.equal('The Three Musketeers and Plus');
  });
});

Bitte beachten Sie, dass ich eine ganze Reihe von Sonderzeichen aus den bereitgestellten Zeichenketten entferne. Sie müssen die Regex so anpassen, dass sie den Anforderungen Ihres Projekts entspricht.

0 Stimmen

Ich bevorzuge diese Lösung, da sie die Groß- und Kleinschreibung des Titels wirklich berücksichtigt. Es heißt nicht "Vom Winde verweht", sondern "Vom Winde verweht".

1 Stimmen

Dies sollte die akzeptierte Antwort sein. Sie haben sogar Tests geschrieben! Ref: titlecase.com danielmiessler.com/blog/a-liste-verschiedener-falltypen github.com/gouch/to-title-case

0 Stimmen

Ist das ein Tippfehler? Sie übergeben 3 Argumente an capitalizeFirstLetter, die nur 1 erwartet. Ich schätze, JavaScript kümmert sich nicht, aber TypeScript hat einen Anfall mit, dass.

14voto

immazharkhan Punkte 385

Wenn die in den obigen Lösungen verwendete Regex Sie verwirrt, versuchen Sie diesen Code:

function titleCase(str) {
  return str.split(' ').map(function(val){ 
    return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase();
  }).join(' ');
}

0 Stimmen

Ich liebe es! Keine Konvertierung in Arrays.

1 Stimmen

Ähhh... split tut in ein Array umwandeln, sieht man es nur nicht so deutlich, weil map bedeutet, dass Sie nicht mit [] Notation

3 Stimmen

Dies ist dasselbe wie a8m's Antwort von 2 Jahren zuvor.

13voto

Lwangaman Punkte 119

Ich habe diese Funktion entwickelt, die Nachnamen (also keine Groß- und Kleinschreibung) wie "McDonald" oder "MacDonald" oder "O'Toole" oder "D'Orazio" verarbeiten kann. Deutsche oder holländische Namen mit "van" oder "von", die oft kleingeschrieben werden, werden jedoch nicht verarbeitet... Ich glaube, "de" wird auch oft kleingeschrieben, z. B. "Robert de Niro". Diese müssten noch behandelt werden.

function toProperCase(s)
{
  return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g,
          function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); });
}

1 Stimmen

+1 für die Bekanntheit des Namens. Allerdings wird "Macy" auch nicht korrekt behandelt.

0 Stimmen

Dies war die einzige Funktion, die Groß- und Kleinbuchstaben korrekt in Großbuchstaben umwandelte und die Initialen wie "U.S. Virgin Islands" bemerkte.

0 Stimmen

Sie können die macy Problem, indem man eine negative Vorausschau einbaut, so dass \b((m)(a?c))?(\w) wird \b((m)(a?c))?(\w)(?!\s)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X