Nie jestem zbyt dobry w manipulowaniu ciągami znaków w JavaScript i zastanawiałem się, jak skrócić ciąg bez obcinania żadnego słowa. Wiem, jak używać podciągów, ale nie indexOf ani niczego naprawdę dobrego.
Powiedzmy, że mam następujący ciąg:
text = "this is a long string I cant display"
Chcę skrócić go do 10 znaków, ale jeśli nie kończy się spacją, zakończ słowo. Nie chcę, aby zmienna łańcuchowa wyglądała tak:
„To jest długi ciąg, którego nie mogę znaleźć”
Chcę, żeby kończyło słowo, aż pojawi się spacja.
javascript
string
substring
Josh Bedo
źródło
źródło
" too many spaces ".trim()
Odpowiedzi:
Jeśli dobrze rozumiem, chcesz skrócić ciąg do określonej długości (np. Skrócić
"The quick brown fox jumps over the lazy dog"
do powiedzmy 6 znaków bez odcinania żadnego słowa).W takim przypadku możesz wypróbować coś takiego:
źródło
maxLength + 1
), ale naprawiłem to, dodając po prostu tę linię u góry:var yourString += " ";
fox jumps over the lazy dog
część, wynik będzie takiThe quick brown
, jak powinienThe quick brown fox
.Można to zrobić na wiele sposobów, ale wyrażenie regularne jest przydatną metodą jednowierszową:
To wyrażenie zwraca pierwszych 11 (dowolnych) znaków oraz wszelkie kolejne znaki niebędące spacjami.
Przykładowy skrypt:
Wynik:
źródło
t.replace(new RegExp("^(.{"+length+"}[^\s]*).*"), "$1")
{30}
Jestem trochę zdziwiony, że na taki prosty problem jest tak wiele odpowiedzi, które są trudne do odczytania, a niektóre, w tym ta wybrana, nie działają.
Zwykle chcę, aby wynikowy ciąg składał się z maksymalnie
maxLen
znaków. Używam również tej samej funkcji, aby skrócić informacje o błędach w adresach URL.str.lastIndexOf(searchValue[, fromIndex])
przyjmuje drugi parametr, który jest indeksem, od którego należy rozpocząć wyszukiwanie wstecz w ciągu, dzięki czemu wszystko jest wydajne i proste.Oto przykładowe dane wyjściowe:
A dla ślimaka:
źródło
str
jestundefined
. Dodałemif (!str || str.length <= maxLen) return str;
str.length <= maxLen
. W przeciwnym razie zwraca pusty ciąg.Wydaje się, że wszyscy zapominają, że indexOf przyjmuje dwa argumenty - ciąg znaków do dopasowania i indeks znaku, od którego ma się rozpocząć wyszukiwanie. Możesz przerwać ciąg przy pierwszej spacji po 10 znakach.
źródło
Lodash ma specjalnie napisaną funkcję:
_.truncate
źródło
W oparciu o odpowiedź NT3RP, która nie obsługuje niektórych przypadków narożnych, stworzyłem ten kod. Gwarantuje, że nie zwróci tekstu ze zdarzeniem size> maxLength,
...
na końcu którego dodano wielokropek .Obsługuje to również niektóre przypadki narożne, takie jak tekst, w którym jedno słowo jest> maxLength
Myślę, że możesz łatwo usunąć zależność jquery, jeśli ci to przeszkadza.
źródło
$.extend
podane argumenty nie powinny być odwrócone?Oto rozwiązanie w jednej linii.
źródło
Spóźniłem się na imprezę, ale oto małe i łatwe rozwiązanie, które wymyśliłem, aby zwrócić pewną liczbę słów.
Nie jest to bezpośrednio związane z twoimi wymaganiami dotyczącymi postaci , ale służy temu samemu rezultatowi, o którym myślę, że chciałeś.
Zobacz działający przykład tutaj: https://jsfiddle.net/bx7rojgL/
źródło
To wyklucza ostatnie słowo, zamiast je włączać.
Stosowanie:
źródło
Przyjąłem inne podejście. Chociaż potrzebowałem podobnego wyniku, chciałem, aby moja wartość zwracana była mniejsza niż określona długość.
Edytuj Poprawiłem to trochę tutaj: Przykład JSFiddle . Łączy ponownie oryginalną tablicę zamiast konkatenacji.
źródło
Pokaż fragment kodu
źródło
Możesz użyć
truncate
jednej linijki poniżej:źródło
}
var s = "to jest długi ciąg i nie mogę wyjaśnić wszystkiego"; skrócić (s, 10, '...')
/* "to jest .." */
źródło
Oto kolejny fragment kodu, który skraca się wzdłuż znaków interpunkcyjnych (szukałem tego, a Google znalazło to pytanie tutaj). Musiałem sam wymyślić rozwiązanie, więc włamałem się do tego w 15 minut. Znajduje wszystkie wystąpienia. ! ? i obcina w dowolnej pozycji tych, które są <niż
len
źródło
Maszynopis iz elipsami :)
źródło
`` Makaron z pomidorami i szpinakiem ''
jeśli nie chcesz przeciąć słowa na pół
pierwsza iteracja:
acc: 0 / acc + cur.length = 5 / newTitle = ['Pasta'];
druga iteracja:
acc: 5 / acc + cur.length = 9 / newTitle = ['Pasta', 'with'];
trzecia iteracja:
acc: 9 / acc + cur.length = 15 / newTitle = ['Pasta', 'with', 'tomato'];
czwarta iteracja:
acc: 15 / acc + cur.length = 18 (limit bound) / newTitle = ['Pasta', 'with', 'tomato'];
wyjście: Makaron z pomidorami ...
źródło
Na co warto napisałem to, aby obciąć do granicy słowa bez pozostawiania znaków interpunkcyjnych lub białych znaków na końcu ciągu:
źródło
Głosowane rozwiązania nie zostały uznane za satysfakcjonujące. Więc napisałem coś, co jest rodzajowe i działa zarówno jako pierwsza, jak i ostatnia część twojego tekstu (coś w rodzaju substr, ale dla słów). Możesz także ustawić, czy chcesz, aby spacje zostały pominięte w liczbie znaków.
źródło
Spóźniłem się na to, ale myślę, że ta funkcja robi dokładnie to, czego żąda OP. Możesz łatwo zmienić wartości SENTENCE i LIMIT dla różnych wyników.
W wyniku tego fragmentu LIMIT 11 to:
źródło
Z warunkami brzegowymi, takimi jak puste zdanie i bardzo długie pierwsze słowo. Ponadto nie używa specyficznego dla języka interfejsu API / biblioteki.
źródło
Możesz przycinać spacje za pomocą tego:
źródło
Zaktualizowano z @ NT3RP Odkryłem, że jeśli ciąg uderzy w spację za pierwszym razem, spowoduje to usunięcie tego słowa, czyniąc ciąg o jedno słowo krótszym, niż może być. Dlatego właśnie dodałem instrukcję if else, aby sprawdzić, czy wartość maxLength nie przypada na spację.
codepen.io
źródło