The two truncate functions provided below, have some major short comings.
1. They may cut a word in half
2. In case you are using htmlentities to get user input or are using wysiwyg editors to get user input, you can get truncated text like "he told C&eac..." instead of "he told Cécile" or "he told".
Here is what I use -
<?php
function truncate($text,$numb) {
// source: www.kigoobe.com, please keep this if you are using the function
$text = html_entity_decode($text, ENT_QUOTES);
if (strlen($text) > $numb) {
$text = substr($text, 0, $numb);
$text = substr($text,0,strrpos($text," "));
$etc = " ...";
$text = $text.$etc;
}
$text = htmlentities($text, ENT_QUOTES);
return $text;
}
// Now, to use this function, you can call that as -
truncate($text, 75);
?>
substr_replace
(PHP 4, PHP 5)
substr_replace — Ersetzt Text innerhalb einer Zeichenkette
Beschreibung
substr_replace() ersetzt in einer Kopie von
string alle Zeichen, die sich innerhalb der
durch die Parameter start und (optional)
length festgelegten Grenze befinden, mit der in
replacement angegebenen Zeichenkette.
Parameter-Liste
-
string -
Die Eingabezeichenkette.
Ein array von strings kann übergeben werden; die Ersetzungen erfolgen dann bei jeder Zeichenkette der Reihe nach. In diesem Fall können die
replacement,startundlengthParameter entweder als Skalar übergeben werden, die auf jede Eingabezeichenkette der Reihe nach angewandt werden, oder als arrays; in diesem Fall wird das entsprechende Array Element für jede Eingabe Zeichenkette genutzt. -
replacement -
Die Ersetzungszeichenkette
-
start -
Ist
startpositiv, beginnt die Ersetzung ab der im Offset-Parameterstartdefinierten Stelle innerhalb vonstring.Ist
startnegativ, wird vom Ende der Zeichenkettestringbis zum Wert vonstartrückwärts gezählt und dort mit dem Austausch begonnen. -
length -
Ist der Parameter angegeben und positiv, stellt dieser Parameter die Länge des auszuwechselnden Teils von
stringdar. Ist der Wert negativ, gibt er die Zeichenzahl an, um die ab Ende vonstringrückwärts gezählt wird. Bis zu dieser Stelle erfolgt dann der Austausch. Ist der Parameter nicht angegeben, wird standardmäßig eine Ersetzung bis zum Ende des Strings (strlen(string)) durchgeführt, das heißt, die Ersetzung endet mit dem Ende vonstring. Solltelengthden Wert null haben, wird die Funktion die Zeichenkettereplacementinstringan der durchstartbezeichneten Stelle einfügen.
Rückgabewerte
Der entstehende String wird zurückgegeben. Ist string
ein Array, wird auch ein Array zurückgegeben.
Beispiele
Beispiel #1 Einfache substr_replace()-Beispiele
<?php
$var = 'ABCDEFGH:/MNRPQR/';
echo "Original: $var<hr />\n";
/* Die beiden Beispiele ersetzten alle Vorkommen von
$var durch 'bob'. */
echo substr_replace($var, 'bob', 0) . "<br />\n";
echo substr_replace($var, 'bob', 0, strlen($var)) . "<br />\n";
/* Einfügen von 'bob' direkt am Anfang von $var. */
echo substr_replace($var, 'bob', 0, 0) . "<br />\n";
/* Die nächsten beiden Beispiele ersetzen 'MNRPQR' in $var
durch 'bob'. */
echo substr_replace($var, 'bob', 10, -1) . "<br />\n";
echo substr_replace($var, 'bob', -7, -1) . "<br />\n";
/* Entfernen von 'MNRPQR' aus $var. */
echo substr_replace($var, '', 10, -1) . "<br />\n";
?>
Beispiel #2 Nutzung von substr_replace() um mehrere Zeichenketten auf einmal zu ersetzen.
<?php
$input = array('A: XXX', 'B: XXX', 'C: XXX');
// Ein einfacher Fall: ersetze XXX in jeder Zeichenkette mit YYY.
echo implode('; ', substr_replace($input, 'YYY', 3, 3))."\n";
// Ein komplizierterer Fall bei dem jede Ersetzung unterschiedlich ist.
$replace = array('AAA', 'BBB', 'CCC');
echo implode('; ', substr_replace($input, $replace, 3, 3))."\n";
// Ersetze eine jedesmal unterschiedliche Anzahl von Zeichen
$length = array(1, 2, 3);
echo implode('; ', substr_replace($input, $replace, 3, $length))."\n";
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
A: YYY; B: YYY; C: YYY A: AAA; B: BBB; C: CCC A: AAAXX; B: BBBX; C: CCC
Anmerkungen
Hinweis: Diese Funktion ist binary safe.
Siehe auch
- str_replace() - Ersetzt alle Vorkommen des Suchstrings durch einen anderen String
- substr() - Gibt einen Teil eines Strings zurück
- Zeichenketten Zugriff und Veränderung je Zeichen
substr_replace
21-Mar-2007 11:00
09-Dec-2005 12:33
I don't know if this function is multibyte safe but I've written a function that will do the same in multibyte mode.
<?php
//Check to see if it exists in case PHP has this function later
if (!function_exists("mb_substr_replace")){
//Same parameters as substr_replace with the extra encoding parameter.
function mb_substr_replace($string,$replacement,$start,$length=null,$encoding = null){
if ($encoding == null){
if ($length == null){
return mb_substr($string,0,$start).$replacement;
}
else{
return mb_substr($string,0,$start).$replacement.mb_substr($string,$start + $length);
}
}
else{
if ($length == null){
return mb_substr($string,0,$start,$encoding).$replacement;
}
else{
return mb_substr($string,0,$start,$encoding). $replacement. mb_substr($string,$start + $length,mb_strlen($string,$encoding),$encoding);
}
}
}
}
?>
06-Dec-2005 05:47
I created this because of the need to mask a credit-card number like **** **** **** 8862
string mask ( string str, int start [, int length] )
mask() masks a copy of str delimited by the start and (optionally) length parameters with asterisks (*) in place of non-whitespace characters
<?php
function mask ( $str, $start = 0, $length = null ) {
$mask = preg_replace ( "/\S/", "*", $str );
if ( is_null ( $length )) {
$mask = substr ( $mask, $start );
$str = substr_replace ( $str, $mask, $start );
} else {
$mask = substr ( $mask, $start, $length );
$str = substr_replace ( $str, $mask, $start, $length );
}
return $str;
}
?>
27-Aug-2005 08:48
I suggest changing the function suggested by Guru Evi slightly. I found that it doesn't work as written here.
Original:
function add_3dots($string,$repl,$start,$limit) {
if(strlen($string) > $limit) {
return substr_replace(strip_tags($string),$repl,$start,$limit);
} else {
return $string;
};
};
I suggest:
function add_3dots($string,$repl,$limit) {
if(strlen($string) > $limit) {
return substr_replace(strip_tags($string),$repl,$limit-strlen($repl));
} else {
return $string;
}
}
Usage:
$max_length=10;//the max number of characters you want to display
$too_long_string="BLAH BLAH BLAH BLAH BLAH etc.";//the string you want to shorten (if it's longer than the $limit)
$shorter_string=add_3_dots($too_long_string,"...",$max_length);
13-Jul-2005 09:44
If your string is not long enough to meet what you specify in start and length then the replacement string is added towards the end of the string.
I wanted to replace the end of the string with ... if the string was too long to display (for instance article preview on a website). The problem was that my string was sometimes not that long and it still added the replacement string. So I wrote a function to replace substr_replace in my website:
function add_3dots($string,$repl,$start,$limit) {
if(strlen($string) > $limit) {
return substr_replace(strip_tags($string),$repl,$start,$limit);
} else {
return $string;
};
};
I use strip_tags to strip out the HTML otherwise you might get a screwed up HTML (when a tags open in the string, but because you cut-off it doesn't)
22-Jan-2005 12:02
Actually, just a minor correction to tekrat at 2d dot com's post:
Change the code....
<?
if(strlen($substring) < 1){
$string = $rep;
}else{
$string = $substring;
}
?>
.... into....
<?
if(strlen($substring) >= 1){
$string = $substring;
}
?>
.... otherwise you'll end up with the elipses (...) for any null strings.
06-Jan-2005 05:55
Here's a slightly revised version of the truncation function above.
Theres isn't much of a reason to add in the $rep at the end of the original string is less then the truncation break point.
<?
function truncate($substring, $max = 50, $rep = '...') {
if(strlen($substring) < 1){
$string = $rep;
}else{
$string = $substring;
}
$leave = $max - strlen ($rep);
if(strlen($string) > $max){
return substr_replace($string, $rep, $leave);
}else{
return $string;
}
}
?>
10-Dec-2004 11:48
Using substr_replace() can be avoided by using substr() instead:
<?
$string = substr($string, 0, $position_needle).$replace.substr($string, $position_needle+$length_needle);
?>
This can be useful when you need to replace parts of multibyte strings like strings encoded with utf-8. There isn't a multibute variant for substr_replace(), but for php substr() there is mb_substr(). For more information on multibyte strings see http://nl3.php.net/manual/en/ref.mbstring.php
04-Aug-2004 11:28
A simple but useful 'pluralize' function using substr_replace:
function pluralize($noun) {
if ($noun{strlen($noun) -1} == "y")
$noun = substr_replace($noun, "ies", strlen($noun) -1);
else
$noun .= "s";
return $noun;
}
Handy when displaying dynamic text.
18-Jun-2004 01:34
Regarding "...", even the short functions are too long and complicated, and there's no need to use substr_replace. substr() works better and is way faster prior to 4.3.5 as the below poster stated.
function shorten( $str, $num = 100 ) {
if( strlen( $str ) > $num ) $str = substr( $str, 0, $num ) . "...";
return $str;
}
13-May-2004 09:55
The substr_replace() function is extremely slow in PHP versions prior to 4.3.5 and 5.0.0 so consider using an alternative before this time.
10-May-2004 11:25
The comment by geniusdex is a good one. Short, simple functions are the best. But if the string is not longer than the limit set, NOTHING is returned. Here is the function re-done to always return a string:
<?php
function dot($str, $len, $dots = "...") {
if (strlen($str) > $len) {
$dotlen = strlen($dots);
$str = substr_replace($str, $dots, $len - $dotlen);
}
return $str;
}
?>
23-Feb-2004 04:33
This is my version of making dotted strings:
<?php
function dot($str, $len, $dots = "...") {
if (strlen($str) > $len) {
$dotlen = strlen($dots);
substr_replace($str, $dots, $len - $dotlen);
}
}
?>
20-Jan-2004 08:05
I wrote a function that you can use for example in combination with a search script to cut off the articles that are too long.
<?php
function substr_index($text, $maxChars = 20, $splitter
= '...') {
$theReturn = $text;
$lastSpace = false;
if (strlen($text) > $maxChars) {
$theReturn = substr($text, 0, $maxChars - 1);
if (in_array(substr($text, $maxChars - 1, 1),
array(' ', '.', '!', '?'))) {
$theReturn .= substr($text, $maxChars, 1);
} else {
$theReturn = substr($theReturn, 0, $maxChars -
strlen($splitter));
$lastSpace = strrpos($theReturn, ' ');
if ($lastSpace !== false) {
$theReturn = substr($theReturn, 0, $lastSpace);
}
if (in_array(substr($theReturn, -1, 1), array(','))) {
$theReturn = substr($theReturn, 0, -1);
}
$theReturn .= $splitter;
}
}
return $theReturn;
}
?>
05-Nov-2003 01:40
The easiest way (I think) to add trailing dots after a string which in my case are too long is:
<?
function dots($num, $string) {
if (strlen($string) < $num) {
$string = substr_replace($string, '...', '-10', $num);
}
return $string;
}
Then on your page do something like:
<? echo dots("30" $row['title']); ?>
if the string is greater than the specific number it'll replace 3 dots.
I hope this helps =)
?>
06-Jul-2003 02:36
Here is a simple function to shorten a string and add an ellipsis
<?php
/**
* truncate() Simple function to shorten a string and add an ellipsis
*
* @param string $string Origonal string
* @param integer $max Maximum length
* @param string $rep Replace with... (Default = '' - No elipsis -)
* @return string
* @author David Duong
**/
function truncate ($string, $max = 50, $rep = '') {
$leave = $max - strlen ($rep);
return substr_replace($string, $rep, $leave);
}
echo truncate ('akfhslakdhglksjdgh', 10, '...');
// Returns akfhsla... (10 chrs)
?>
09-Oct-2002 12:01
To abbreviate links into '...' if they outreach a certain amount of space; use the preg_replace function instead.
For instance you grabbed the headlines of a news site for use on your own page and the lines are to long:
asuming the raw material is stored in $unedited;
$edited = preg_replace("/(>)([[:print:]]{52,})(<)/e", "'\\1'.substr_replace('\\2 ', '...', '48').'\\3'", $unedited);
echo $edited;
This will shorten strings longer than 52 characters into 51 characters, with the last being three dots...
13-Feb-2002 07:38
THE DOT DOT DOT ISSUE
PROBLEM:
You want to abbreviate a string.
E.g. You want "BritneySpears" to show as "BritneySpe...", being only the ten first characters followed by "..."
SOLUTION:
<?
$oRIGINAL = "BritneySpears";
$sHORTER = substr_replace($oRIGINAL, '...', 10);
echo ($sHORTER);
?>
This will result in BritneySpe...
If you would like to remove characters from the start or end of a string, try the substr() function.
For example, to remove the last three characters from a string:
$string = "To be or not to be.";
$string = substr ($string, 0, -3);
16-Apr-2001 09:16
Just to add to the examples, if replacement is longer than length, only the length number of chars are removed from string and all of replacement is put in its place, and therefor strlen($string) is inreased.
$var = 'ABCDEFGH:/MNRPQR/';
/* Should return ABCDEFGH:/testingRPQR/ */
echo substr_replace ($var, 'testing', 10, 2);
01-Apr-2001 10:33
If you are trying to use -0, I don't think it works. For example:
substr_replace($file,'',-4,0)
There may be an alternative though...
14-Mar-2001 03:29
[Editor's note: for a much simpler solution, use number_format()]
I had a situation in which I needed to add a comma to the third position of a number(the price of something).
<p>
$price = "12000";<br>
$price = substr_replace ($price, ',', -3, 0)";<br>
the result would be 12,000<p>
the -3 counts from right to left. a regular 3 would count from left to right
I hope this helps...