note 49258 added to ref.strings

From: Date: Fri, 21 Jan 2005 18:40:56 +0000
Subject: note 49258 added to ref.strings
Groups: php.notes 
Request: Send a blank email to php-notes+get-83738@lists.php.net to get a copy of this message
This function gets a substring without cutting words in the middle. You can reduce the main string by the left, right (default), both or by the center. I think the parameters are self-explicative. :) Regards, Carlos <?php define("STR_REDUCE_LEFT", 1); define("STR_REDUCE_RIGHT", 2); define("STR_REDUCE_CENTER", 4); echo str_word_count("CArlos", 100); function str_reduce($str, $max_length, $append = NULL, $position = STR_REDUCE_RIGHT, $remove_extra_spaces = true) { if ((!is_string($str)) || (!is_int($max_length)) || (!is_string($append) && $append !== NULL) || (!is_int($position)) || (($position != STR_REDUCE_LEFT) && ($position != STR_REDUCE_RIGHT) && ($position != STR_REDUCE_CENTER) && ($position != STR_REDUCE_LEFT | STR_REDUCE_RIGHT)) ) { echo "<br /><strong>Warning</strong>: Bad arguments for " . __FUNCTION__ . "()."; return false; } if ($append === NULL) { $append = "..."; } $str = html_entity_decode($str); if ((bool)$remove_extra_spaces) { $str = preg_replace("/\s+/s", " ", trim($str)); } if (strlen($str) <= $max_length) { return html_entities($str); } if ($position == STR_REDUCE_LEFT) { $str_reduced = preg_replace("/^.*?(\s.{0," . $max_length . "})$/s", "\\1", $str); while ((strlen($str_reduced) + strlen($append)) > $max_length) { $str_reduced = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $str_reduced); } $str_reduced = $append . $str_reduced; } else if ($position == STR_REDUCE_RIGHT) { $str_reduced = preg_replace("/^(.{0," . $max_length . "}\s).*?$/s", "\\1", $str); while ((strlen($str_reduced) + strlen($append)) > $max_length) { $str_reduced = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $str_reduced); } $str_reduced .= $append; } else if ($position == (STR_REDUCE_LEFT | STR_REDUCE_RIGHT)) { $offset = ceil((strlen($str) - $max_length) / 2); $str_reduced = preg_replace("/^.{0," . $offset . "}|.{0," . $offset . "}$/s", "", $str); $str_reduced = preg_replace("/^[^\s]+|[^\s]+$/s", "", $str_reduced); while ((strlen($str_reduced) + (2 * strlen($append))) > $max_length) { $str_reduced = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $str_reduced); if ((strlen($str_reduced) + (2 * strlen($append))) > $max_length) { $str_reduced = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $str_reduced); } } $str_reduced = $append . $str_reduced . $append; } else if ($position == STR_REDUCE_CENTER) { $pattern = "/^(.{0," . floor($max_length / 2) . "}\s)|(\s.{0," . floor($max_length / 2) . "})$/s"; preg_match_all($pattern, $str, $matches); $begin_chunk = $matches[0][0]; $end_chunk = $matches[0][1]; while ((strlen($begin_chunk) + strlen($append) + strlen($end_chunk)) > $max_length) { $end_chunk = preg_replace("/^\s?[^\s]+(\s.*)$/s", "\\1", $end_chunk); if ((strlen($begin_chunk) + strlen($append) + strlen($end_chunk)) > $max_length) { $begin_chunk = preg_replace("/^(.*?\s)[^\s]+\s?$/s", "\\1", $begin_chunk); } } $str_reduced = $begin_chunk . $append . $end_chunk; } return htmlentities($str_reduced); } ?> ---- Manual Page -- http://www.php.net/manual/en/ref.strings.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+49258 Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+49258&report=yes&reason=added+to+the+manual Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+49258&report=yes&reason=bad+code Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+49258&report=yes&reason=spam Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+49258&report=yes&reason=useless Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+49258&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+49258&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#83738) next »