note 49258 added to ref.strings
| From: | carlosreche at yahoo dot com | 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