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.

963voto

Greg Dean Punkte 27938

Versuchen Sie dies:

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

<form>
  Input:
  <br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)" onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
  <br />Output:
  <br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>

19 Stimmen

Könnte mir bitte jemand erklären, warum \w\S* verwendet wird, anstelle von \w+ oder \w* zum Beispiel? Ich weiß nicht, warum Sie irgendetwas anderes als Leerzeichen einfügen und daher ändern wollen Jim-Bob a Jim-Bob .

5 Stimmen

@martinCzerwi der \w\S* verursachte auch die Jim-bob Problem von unserer Seite aus. Verwendung von \w* dies gelöst.

15 Stimmen

/([^\W_]+[^\s-]*) */g löst die Jim-Bob Problem, d.h.: jim-bob --> Jim-Bob

318voto

Talha Ashfaque Punkte 2993

Wenn eine CSS-Lösung Ihren Anforderungen entspricht, können Sie die text-transform CSS-Stil für Ihre Steuerelemente:

text-transform: capitalize;

Seien Sie sich nur bewusst, dass sich dies ändern wird:
hello world a Hello World
HELLO WORLD a HELLO WORLD (keine Änderung)
emily-jane o'brien a Emily-jane O'brien (falsch)
Maria von Trapp a Maria Von Trapp (falsch)

67 Stimmen

-1. Diese css funktioniert, aber nicht funktionieren, wie die meisten Menschen erwarten, weil, wenn der Text beginnt als alle Großbuchstaben, gibt es keinen Effekt. webmasterworld.com/forum83/7506.htm

2 Stimmen

@Akshar : Eine Kleinbuchstaben-Regel würde durch eine Titel-Großbuchstaben-Regel ersetzt werden. Da CSS den Quellinhalt nicht verändert, wird die Kleinbuchstaben-Regel entfernt (der Quellinhalt bleibt in Großbuchstaben) und dann die Großbuchstaben-Regel angewandt (was nichts bewirkt).

72 Stimmen

JS wird außerhalb von Browsern verwendet.

235voto

Tuan Punkte 5213

Ein etwas eleganterer Weg, der die Funktion von Greg Dean adaptiert:

String.prototype.toProperCase = function () {
    return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
};

Nennen Sie es so:

"pascal".toProperCase();

5 Stimmen

Denken Sie daran, wenn Sie einen Benutzer mit einem Bindestrich in seinem Namen haben und er Jo-Ann Smith wandelt dieser Code sie in Jo-ann Smith (beachten Sie die Kleinschreibung a en Ann ).

20 Stimmen

@daniellmb Warum sollte er den String-Prototyp nicht ändern? Ich denke, das ist eine gute Lösung. Denken Sie an die offenen Ruby-Klassen, es ist absolut zulässig, Funktionen zu bestehenden Klassen hinzuzufügen, und es ist weithin akzeptiert.

118 Stimmen

@marco-fiset Weil es nicht gut mit anderen zusammenpasst! Schlimme Dinge passieren, wenn Sie 2 Bibliotheken haben, die beide versuchen, native JavaScript-Objekte mit inkompatiblen Änderungen zu modifizieren. Stellen Sie sich vor, wenn jQuery und Google Maps diesem Designmuster folgen würden, könnten Sie nicht beide auf derselben Seite haben.

183voto

a8m Punkte 8928

Hier ist meine Version, die IMO leicht zu verstehen und auch elegant ist.

const str = "foo bar baz";
const newStr = str.split(' ')
   .map(w => w[0].toUpperCase() + w.substring(1).toLowerCase())
   .join(' ');
console.log(newStr);

3 Stimmen

Alternativ können Sie die Teilzeichenkette in der Zuordnung auch klein schreiben: str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')

10 Stimmen

Ich bin nicht einverstanden mit der Bezeichnung .toLowerCase() . Namen wie "McDonald" oder Akronyme wie "ASAP" sollten ihre Großbuchstaben behalten. Wenn jemand tatsächlich eine Zeichenfolge wie "heLLO" eingegeben hat, sollte die Anwendung nicht davon ausgehen, dass die Großbuchstaben falsch sind.

1 Stimmen

@ThomasHigginbotham Wie wäre es damit? String.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }

121voto

Geoffrey Booth Punkte 6844

Hier ist meine Funktion, die den Titel in Großbuchstaben umwandelt, aber auch definierte Akronyme in Großbuchstaben und kleinere Wörter in Kleinbuchstaben beibehält:

String.prototype.toTitleCase = function() {
  var i, j, str, lowers, uppers;
  str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });

  // Certain minor words should be left lowercase unless 
  // they are the first or last words in the string
  lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 
  'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With'];
  for (i = 0, j = lowers.length; i < j; i++)
    str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), 
      function(txt) {
        return txt.toLowerCase();
      });

  // Certain words such as initialisms or acronyms should be left uppercase
  uppers = ['Id', 'Tv'];
  for (i = 0, j = uppers.length; i < j; i++)
    str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), 
      uppers[i].toUpperCase());

  return str;
}

Zum Beispiel:

"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase();
// Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"

1 Stimmen

Ich mochte Ihre, ich habe auch Probleme, wenn es um römische Zahlen geht... ich habe es gerade mit I, II, III, IV, etc. gepatcht.

0 Stimmen

Wörter mit Bindestrich sollten groß geschrieben werden. Mit Ihrer Funktion JIM-BOB geht nicht an Jim-Bob geht es stattdessen an Jim-bob

2 Stimmen

Behoben. Die Regex in der dritten Zeile wurde geändert von /\w\S*/g a /([^\W_]+[^\s-]*) */g gemäß dem obigen Kommentar von @awashburn, um dieses Problem zu lösen.

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