function limit_words($words, $limit, $append = ' …') {
// Add 1 to the specified limit becuase arrays start at 0
$limit = $limit+1;
// Store each individual word as an array element
// Up to the limit
$words = explode(' ', $words, $limit);
// Shorten the array by 1 because that final element will be the sum of all the words after the limit
array_pop($words);
// Implode the array for output, and append an ellipse
$words = implode(' ', $words) . $append;
// Return the result
return $words;
}
Psst! Erstellen Sie ein DigitalOcean-Konto und erhalten Sie 200 $ kostenloses Guthaben für Cloud-basiertes Hosting und Services.
Stattdessen nicht nur Wörter, das funktioniert für Sätze. Also keine halben Sätze mehr
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 300)
{
/* This functions cuts a long string in sentences.
*
* substr_sentence($string, $start, $limit);
* $string = 'A example. By someone that loves PHP. Do you? We do!';
* $start = 0; // we would start at the beginning
* $limit = 10; // so, we get 10 sentences (not 10 words or characters!)
*
* It's not as substr()) in single characters.
* It's not as substr_words() in single words.
*
* No more broken lines in a story. The story/article must go on!
*
* Written by Eddy Erkelens "Zunflappie"
* Published on www.mastercode.nl
* May be free used and adapted
*
*/
// list of sentences-ends. All sentences ends with one of these. For PHP, add the ;
$end_characters = array(
'.',
'?',
'!'
);
// put $string in array $parts, necessary evil
$parts = array($string);
// foreach interpunctation-mark we will do this loop
foreach($end_characters as $end_character)
{
// go thru each part of the sentences we already have
foreach($parts as $part)
{
// make array with the new sentences
$sentences[] = explode($end_character, $part);
}
// unfortunately explode() removes the end character itself. So, place it back
foreach($sentences as $sentence)
{
// some strange stuff
foreach($sentence as $real_sentence)
{
// empty sentence we do not want
if($real_sentence != '')
{
// if there is already an end-character, dont place another one
if(in_array(substr($real_sentence, -1, 1), $end_characters))
{
// store for next round
$next[] = trim($real_sentence);
}
else
{
// store for next round
$next[] = trim($real_sentence).$end_character;
}
}
}
}
// store for next round
$parts = $next;
// unset the remaining and useless stuff
unset($sentences, $sentence, $next);
}
// check for max-char-length
$total_chars = 0;
$sentence_nr = 0;
$sentences = array();
// walk thru each member of $part
foreach($parts as $part)
{
// count the string-lenght and add this to $total_chars
$total_chars += strlen($part);
// if $total-chars is higher then max-char, dont add this sentences!
if($total_chars
@ Eddy Erkelens. Ihre Lösung ist wirklich interessant. Könnten Sie bitte den vollständigen Code der Funktion posten, da sie bei if($total_chars... abgeschnitten wurde.
Hier ist sie Ein bisschen spät, aber ich habe die Funktion wieder für mich gebraucht.
…
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 600)
{ /* Diese Funktion kürzt einen langen Text in Sätze.
* * substr_sentence($string, $start, $limit); * $string = 'Ein Beispiel. Von jemandem, der PHP liebt. Tust du das? Wir tun es!'; * $start = 0; // wir würden am Anfang beginnen * $limit = 10; // also, wir bekommen 10 Sätze (nicht 10 Wörter oder Zeichen!)
* * Es ist nicht wie substr()) in einzelnen Zeichen. * Es ist nicht wie substr_words() in einzelnen Wörtern.
* * Keine kaputten Zeilen mehr in einer Geschichte. Die Geschichte/der Artikel muss weitergehen!
* * Geschrieben von Eddy Erkelens "Zunflappie" * Veröffentlicht auf http://www.mastercode.nl * Kann frei verwendet und angepasst werden
*
*/
// list of sentences-ends. All sentences ends with one of these. For PHP, add the ;
$end_characters = array(
'. ',
'? ',
'! '
);
// put $string in array $parts, necessary evil
$parts = array($string);
// foreach interpunctation-mark we will do this loop
foreach($end_characters as $end_character)
{
// go thru each part of the sentences we already have
foreach($parts as $part)
{
// make array with the new sentences
$sentences[] = explode($end_character, $part);
}
// unfortunately explode() removes the end character itself. So, place it back
foreach($sentences as $sentence)
{
// some strange stuff
foreach($sentence as $real_sentence)
{
// empty sentence we do not want
if($real_sentence != '')
{
// if there is already an end-character, dont place another one
if(in_array(substr($real_sentence, -1, 1), $end_characters))
{
// store for next round
$next[] = trim($real_sentence);
}
else
{
// store for next round and add the removed character
$next[] = trim($real_sentence).$end_character;
}
}
}
}
// store for next round
$parts = $next;
// unset the remaining and useless stuff
unset($sentences, $sentence, $next);
}
// check for max-char-length
$total_chars = 0;
$sentence_nr = 0;
$sentences = array();
// walk thru each member of $part
foreach($parts as $part)
{
// count the string-lenght and add this to $total_chars
$total_chars += strlen($part);
// if $total-chars not already higher then max-char, add this sentences!
if($total_chars
… // durch jedes Mitglied von $part gehen foreach($parts as $part)
{ // die Länge des Strings zählen und zu $total_chars hinzufügen $total_chars += strlen($part);
// if $total-chars not already higher then max-char, add this sentences!
if($total_chars
Zusammen können Sie Sätze eines langen Textes zählen. Schneiden Sie ihn dann in zwei Hälften (verwenden Sie ceil() oder abs()). Schneiden Sie ihn mit substr_sentences() und fertig.
Ich habe einen Fehler in dieser Funktion festgestellt. Wenn mein String zurückgegeben wird, endet jeder Satz mit ".!?", da die Schleife foreach ($end_characters) immer auf das Vorhandensein eines Endzeichens prüft. Und wenn das Endzeichen hinzugefügt wird, wird der String nicht aktualisiert, nur der gespeicherte String. Also jedes Mal, wenn er durch end_characters läuft, enthält der String kein Zeichen, also wird eines hinzugefügt.
Matt – Ich hatte das gleiche Problem, die Funktion hinterließ nach jedem Satz „.!?.“ Der Grund dafür sind unnötige Leerzeichen im Array $end_characters. Zeile Nr. 24 aus Eddys Codepad: http://codepad.org/AqIL9V4N sollte geändert werden in (beachten Sie keine Leerzeichen in jeder Variablen)
Was ist besser auf einer Website mit hohem Traffic?
Stattdessen nicht nur Wörter, das funktioniert für Sätze.
Also keine halben Sätze mehr
@ Eddy Erkelens. Ihre Lösung ist wirklich interessant. Könnten Sie bitte den vollständigen Code der Funktion posten, da sie bei if($total_chars... abgeschnitten wurde.
Hier ist sie
Ein bisschen spät, aber ich habe die Funktion wieder für mich gebraucht.
…
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 600)
{
/* Diese Funktion kürzt einen langen Text in Sätze.
*
* substr_sentence($string, $start, $limit);
* $string = 'Ein Beispiel. Von jemandem, der PHP liebt. Tust du das? Wir tun es!';
* $start = 0; // wir würden am Anfang beginnen
* $limit = 10; // also, wir bekommen 10 Sätze (nicht 10 Wörter oder Zeichen!)
*
* Es ist nicht wie substr()) in einzelnen Zeichen.
* Es ist nicht wie substr_words() in einzelnen Wörtern.
*
* Keine kaputten Zeilen mehr in einer Geschichte. Die Geschichte/der Artikel muss weitergehen!
*
* Geschrieben von Eddy Erkelens "Zunflappie"
* Veröffentlicht auf http://www.mastercode.nl
* Kann frei verwendet und angepasst werden
*
*/
…
Und der letzte Teil... apart.
…
// durch jedes Mitglied von $part gehen
foreach($parts as $part)
{
// die Länge des Strings zählen und zu $total_chars hinzufügen
$total_chars += strlen($part);
…
Verfluchter Bug…
Er wird bei einem Pfeil nach links abgeschnitten.
Also: Codepad zur Rettung. Entschuldigung Chris.
Link: http://codepad.org/AqIL9V4N
Und ein substr_words() : http://codepad.org/jCLTm1zJ
Und ein Satz-Zähler: http://codepad.org/o9I3zdI9
Zusammen können Sie Sätze eines langen Textes zählen.
Schneiden Sie ihn dann in zwei Hälften (verwenden Sie ceil() oder abs()).
Schneiden Sie ihn mit substr_sentences() und fertig.
Hallo,
Ich möchte den Satz auf 200 Zeichen kürzen und danach einen "Weiterlesen"-Link.
Kannst du mir helfen.
Ich habe einen Fehler in dieser Funktion festgestellt. Wenn mein String zurückgegeben wird, endet jeder Satz mit ".!?", da die Schleife foreach ($end_characters) immer auf das Vorhandensein eines Endzeichens prüft. Und wenn das Endzeichen hinzugefügt wird, wird der String nicht aktualisiert, nur der gespeicherte String. Also jedes Mal, wenn er durch end_characters läuft, enthält der String kein Zeichen, also wird eines hinzugefügt.
Matt – Ich hatte das gleiche Problem, die Funktion hinterließ nach jedem Satz „.!?.“ Der Grund dafür sind unnötige Leerzeichen im Array $end_characters. Zeile Nr. 24 aus Eddys Codepad: http://codepad.org/AqIL9V4N sollte geändert werden in (beachten Sie keine Leerzeichen in jeder Variablen)
Ich hoffe, das hilft jemandem!
KB