note 51468 added to function.strpos

From: Date: Thu, 31 Mar 2005 15:06:10 +0000
Subject: note 51468 added to function.strpos
Groups: php.notes 
Request: Send a blank email to php-notes+get-87270@lists.php.net to get a copy of this message
Str Pos Nth (Position of nth occurance of a string) A handy function to get the position of nth occurance of a substring in a string, with an optional param to make it case insenstive. I am calling it strposnth, suggestions welcome. Third optional parameter gets the value of n, e.g puting in 2 will return position of second occurance of needle in haystack: Valid inputs (1 = default) 2,3,4..... Fourth optional parameter can be used to specify the function as case insenstive: Valid inputs (0 = case senstive = default) 1 = case insenstive. Code: <? function strposnth($haystack, $needle, $nth=1, $insenstive=0) { //if its case insenstive, convert strings into lower case if ($insenstive) { $haystack=strtolower($haystack); $needle=strtolower($needle); } //count number of occurances $count=substr_count($haystack,$needle); //first check if the needle exists in the haystack, return false if it does not //also check if asked nth is within the count, return false if it doesnt if ($count<1 || $nth > $count) return false; //run a loop to nth number of accurance //start $pos from -1, cause we are adding 1 into it while searchig //so the very first iteration will be 0 for($i=0,$pos=0,$len=0;$i<$nth;$i++) { //get the position of needle in haystack //provide starting point 0 for first time ($pos=0, $len=0) //provide starting point as position + length of needle for next time $pos=strpos($haystack,$needle,$pos+$len); //check the length of needle to specify in strpos //do this only first time if ($i==0) $len=strlen($needle); } //return the number return $pos; } ?> I just construct this function after trying to search a similar one to use in a shopping cart. I am using this to display a limited number of lines or text for featured products. My aim is to limit the product description to 100 characters or 3 lines / 3 list items whichever is less. Example code goes like this <? //get the product description from recordset $text=$row['product_desc']; //strip off text if its longer than 100 characters if (strlen($text)>100) $text=substr($text,0,100)." ..."; //get ending of the third line $pos=strposnth($text,"\n",3,1); //if found, strip off text after that if($pos) $text=substr($text,0,$pos); //nl2li (new line 2 list) this function converts the \n seprated lines of text into sorted or unsorted lists //I have posted this function in nl2br //http://uk2.php.net/manual/en/function.nl2br.php $text=nl2li($text); echo $text; ?> Examples: strposnth("I am trying to go now.","o"); // returns 13 (strpos behavior) strposnth("I am trying to go now.","O"); // returns false (strpos behavior) strposnth("I am trying to go now.","o",2); // returns 16 (second occurance) strposnth("I am trying to go now.","o",7); // returns false (occurance count is less than 7) strposnth("I am trying to go now.","O",1,1); // returns 13 (stripos behavior) strposnth("I am trying to go now.","O",3,1); // returns 19 (stripos behavior + nth occurance) Suggestions and corrections are welcome. Regards, webKami [at] akdomains.com ---- Manual Page -- http://www.php.net/manual/en/function.strpos.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+51468 Delete: added to the manual -- http://master.php.net/manage/user-notes.php?action=delete+51468&report=yes&reason=added+to+the+manual Delete: bad code -- http://master.php.net/manage/user-notes.php?action=delete+51468&report=yes&reason=bad+code Delete: spam -- http://master.php.net/manage/user-notes.php?action=delete+51468&report=yes&reason=spam Delete: useless -- http://master.php.net/manage/user-notes.php?action=delete+51468&report=yes&reason=useless Delete: other reasons -- http://master.php.net/manage/user-notes.php?action=delete+51468&report=yes Reject -- http://master.php.net/manage/user-notes.php?action=reject+51468&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#87270) next »