|
substr_replace
Replace text within a portion of a string
(PHP 4, PHP 5)
Example 2476. substr_replace() example<?php Related Examples ( Source code ) » substr_replace Examples ( Source code ) » String replace Examples ( Source code ) » Substring replace Code Examples / Notes » substr_replacejgainey
[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). $price = "12000"; $price = substr_replace ($price, ',', -3, 0)"; the result would be 12,000 the -3 counts from right to left. a regular 3 would count from left to right I hope this helps... danieldoorduin
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 thomasnospam
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... geniusdex
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); } } ?> www.kigoobe.com
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); ?> philip
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.
neon
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 =) ?> klaas
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... tony
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; } ?> dmron
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; } mrbrown8
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); guru evi
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) 29-sep-2001 04:30
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); stefan
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... joecorcoran
I've made a minor amendment to the function in the post below, to strip away the full stop (period) if the truncation occurs at the exact end of a sentence (the full stop spoils the ellipsis): <?php function truncate($text,$numb) { $text = html_entity_decode($text, ENT_QUOTES); if (strlen($text) > $numb) { $text = substr($text, 0, $numb); $text = substr($text,0,strrpos($text," ")); //This strips the full stop: if ((substr($text, -1)) == ".") { $text = substr($text,0,(strrpos($text,"."))); } $etc = "..."; $text = $text.$etc; } $text = htmlentities($text, ENT_QUOTES); return $text; } //Call function truncate($text, 75); thijs wijnmaalen thijs
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; } ?> hermes
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); alishahnovin
I like the truncate function below...however, I found a few issues. Particularly if you have content that may have any kind of punctuation in it (?, !, ?!?, --, ..., .., ;, etc.) The older function would end up looking like "blah blah?..." or "blah blah,..." which doesn't look so nice to me... Here's my fix. It removes all trailing punctuation (that you include in the $punctuation string below) and then adds an ellipse. So even if it has an ellipse with 3 dots, 2 dots, 4 dots, it'll be removed, then re-added. <?php function truncate($text,$numb,$etc = "...") { $text = html_entity_decode($text, ENT_QUOTES); if (strlen($text) > $numb) { $text = substr($text, 0, $numb); $text = substr($text,0,strrpos($text," ")); $punctuation = ".!?:;,-"; //punctuation you want removed $text = (strspn(strrev($text), $punctuation)!=0) ? substr($text, 0, -strspn(strrev($text), $punctuation)) : $text; $text = $text.$etc; } $text = htmlentities($text, ENT_QUOTES); return $text; } ?> I also needed a sort of "middle" truncate. The above function truncates around the end, but if you want to truncate around the middle (ie "Hello this is a long string." --> "Hello this ... long string.") you can use this (requires the truncate function): <?php function mtruncate($text, $numb, $etc = " ... ") { $first_part = truncate(truncate($text, strlen($text)/2, ""), $numb/2, ""); $second_part = truncate(strrev(truncate(strrev($text), strlen($text)/2, "")), $numb/2, ""); return $first_part.$etc.$second_part; } ?> chuayw2000
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); } } } } ?> michael
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; } ?> tekrat
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; } } ?> david
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) ?> ogt
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. titbits
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. |
Change Languageaddcslashes addslashes bin2hex chop chr chunk_split convert_cyr_string convert_uudecode convert_uuencode count_chars crc32 crypt echo explode fprintf get_html_translation_table hebrev hebrevc html_entity_decode htmlentities htmlspecialchars_decode htmlspecialchars implode join levenshtein localeconv ltrim md5_file md5 metaphone money_format nl_langinfo nl2br number_format ord parse_str printf quoted_printable_decode quotemeta rtrim setlocale sha1_file sha1 similar_text soundex sprintf sscanf str_getcsv str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strrchr strrev strripos strrpos strspn strstr strtok strtolower strtoupper strtr substr_compare substr_count substr_replace substr trim ucfirst ucwords vfprintf vprintf vsprintf wordwrap |