note 59719 added to function.substr

From: Date: Wed, 14 Dec 2005 10:54:00 +0000
Subject: note 59719 added to function.substr
Groups: php.notes 
Request: Send a blank email to php-notes+get-100117@lists.php.net to get a copy of this message
Here's a little addon to the html_substr function posted by fox. Now it counts only chars outside of tags, and doesn't cut words. Note: this will only work in xhtml strict/transitional due to the checking of "/>" tags and the requirement of quotations in every value of a tag. It's also only been tested with the presence of br, img, and a tags, but it should work with the presence of any tag. <?php function html_substr($posttext, $minimum_length = 200, $length_offset = 20, $cut_words = FALSE, $dots = TRUE) { // $minimum_length: // The approximate length you want the concatenated text to be // $length_offset: // The variation in how long the text can be in this example text // length will be between 200 and 200-20=180 characters and the // character where the last tag ends // Reset tag counter & quote checker $tag_counter = 0; $quotes_on = FALSE; // Check if the text is too long if (strlen($posttext) > $minimum_length) { // Reset the tag_counter and pass through (part of) the entire text $c = 0; for ($i = 0; $i < strlen($posttext); $i++) { // Load the current character and the next one // if the string has not arrived at the last character $current_char = substr($posttext,$i,1); if ($i < strlen($posttext) - 1) { $next_char = substr($posttext,$i + 1,1); } else { $next_char = ""; } // First check if quotes are on if (!$quotes_on) { // Check if it's a tag // On a "<" add 3 if it's an opening tag (like <a href...) // or add only 1 if it's an ending tag (like </a>) if ($current_char == '<') { if ($next_char == '/') { $tag_counter += 1; } else { $tag_counter += 3; } } // Slash signifies an ending (like </a> or ... />) // substract 2 if ($current_char == '/' && $tag_counter <> 0) $tag_counter -= 2; // On a ">" substract 1 if ($current_char == '>') $tag_counter -= 1; // If quotes are encountered, start ignoring the tags // (for directory slashes) if ($current_char == '"') $quotes_on = TRUE; } else { // IF quotes are encountered again, turn it back off if ($current_char == '"') $quotes_on = FALSE; } // Count only the chars outside html tags if($tag_counter == 2 || $tag_counter == 0){ $c++; } // Check if the counter has reached the minimum length yet, // then wait for the tag_counter to become 0, and chop the string there if ($c > $minimum_length - $length_offset && $tag_counter == 0 && ($next_char == ' ' || $cut_words == TRUE)) { $posttext = substr($posttext,0,$i + 1); if($dots){ $posttext .= '...'; } return $posttext; } } } return $posttext; } ?> ---- Manual Page -- http://www.php.net/manual/en/function.substr.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+59719 Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=added+to+the+manual Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=bad+code Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=spam Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=useless Delete: non-english -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=non-english Delete: already in docs -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes&reason=already+in+docs Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+59719&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+59719&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#100117) next »