note 102336 deleted from function.strpos by levim
| From: | levim@php.net | Date: | Tue, 22 Jul 2014 03:28:41 +0000 |
| Subject: | note 102336 deleted from function.strpos by levim | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-200014@lists.php.net to get a copy of this message | ||
Note Submitter: jaimthorn at yahoo dot com
----
A complete set of strn*pos functions that look for the nth occurrence of the needle in the haystack.
I prefer this implementation of strnpos because it doesn't give visible warnings when supplied
with a needle of length 0 (which is, admittedly, non-standard behavior). Based on a version I
[originally posted on 05-MAR-2010]; this new version conforms more to the semantics of strpos.
<?php
/**
* This function implements all the strn*pos functions, which return the $nth occurrence of $needle
* in $haystack, or false if it doesn't exist / when illegal parameters have been supplied.
*
* @param string $haystack the string to search in.
* @param MIXED $needle the string or the ASCII value of the character to search for.
* @param integer $nth the number of the occurrence to look for.
* @param integer $offset the position in $haystack to start looking for $needle.
* @param bool $insensitive should the function be case insensitive?
* @param bool $reverse should the function work its way backwards in the haystack?
* @return MIXED integer either the position of the $nth occurrence of $needle in
$haystack,
* or boolean false if it can't be found.
*/
function strnripos_generic( $haystack, $needle, $nth, $offset, $insensitive, $reverse )
{
// If needle is not a string, it is converted to an integer and applied as the ordinal value of
a character.
if( ! is_string( $needle ) ) {
$needle = chr( (int) $needle );
}
// Are the supplied values valid / reasonable?
$len = strlen( $needle );
if( 1 > $nth || 0 === $len ) {
return false;
}
if( $insensitive ) {
$haystack = strtolower( $haystack );
$needle = strtolower( $needle );
}
if( $reverse ) {
$haystack = strrev( $haystack );
$needle = strrev( $needle );
}
// $offset is incremented in the call to strpos, so make sure that the first
// call starts at the right position by initially decreasing $offset by $len.
$offset -= $len;
do
{
$offset = strpos( $haystack, $needle, $offset + $len );
} while( --$nth && false !== $offset );
return false === $offset || ! $reverse ? $offset : strlen( $haystack ) - $offset;
}
/**
* @see strnripos_generic
*/
function strnpos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, false, false );
}
/**
* @see strnripos_generic
*/
function strnipos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, true, false );
}
/**
* @see strnripos_generic
*/
function strnrpos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, false, true );
}
/**
* @see strnripos_generic
*/
function strnripos( $haystack, $needle, $nth, $offset = 0 )
{
return strnripos_generic( $haystack, $needle, $nth, $offset, true, true );
}
$haystack = 'Dit is een HoTtentotTentenTentenToonstellingTest!';
echo strnpos ( $haystack, 't', 5 ), ' === ', strnpos ( $haystack, 116, 5 ),
PHP_EOL;
echo strnipos ( $haystack, 't', 5 ), ' === ', strnipos ( $haystack, 116, 5 ),
PHP_EOL;
echo strnrpos ( $haystack, 't', 5 ), ' === ', strnrpos ( $haystack, 116, 5 ),
PHP_EOL;
echo strnripos( $haystack, 't', 5 ), ' === ', strnripos( $haystack, 116, 5 ),
PHP_EOL;
echo PHP_EOL;
echo strnpos ( $haystack, 'T', 5 ), ' === ', strnpos ( $haystack, 84, 5 ),
PHP_EOL;
echo strnipos ( $haystack, 'T', 5 ), ' === ', strnipos ( $haystack, 84, 5 ),
PHP_EOL;
echo strnrpos ( $haystack, 'T', 5 ), ' === ', strnrpos ( $haystack, 84, 5 ),
PHP_EOL;
echo strnripos( $haystack, 'T', 5 ), ' === ', strnripos( $haystack, 84, 5 ),
PHP_EOL;
?>