From 9a5601efeffa1614ecfa1ace5c713fec1eab1bb4 Mon Sep 17 00:00:00 2001 From: Tadeu Bento Date: Thu, 9 Apr 2015 23:15:13 +0100 Subject: [PATCH] Added indexOf and indexOfLast --- README.md | 30 ++++++++++++++++++++++++++++++ src/StaticStringy.php | 28 ++++++++++++++++++++++++++++ src/Stringy.php | 28 +++++++++++++++++++++++++++- tests/CommonTest.php | 21 +++++++++++++++++++++ tests/StaticStringyTest.php | 19 +++++++++++++++++++ tests/StringyTest.php | 19 +++++++++++++++++++ 6 files changed, 144 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3dbb7d9..eab04dc 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ PHP 5.3+ and HHVM. Inspired by underscore.string.js. * [hasLowerCase](#haslowercase) * [hasUpperCase](#hasuppercase) * [humanize](#humanize) + * [indexOf](#indexof) + * [indexOfLast](#indexoflast) * [insert](#insert) * [isAlpha](#isalpha) * [isAlphanumeric](#isalphanumeric) @@ -447,6 +449,34 @@ S::create('author_id')->humanize(); S::humanize('author_id'); // 'Author' ``` +#### indexOf + +$stringy->indexOf(string $substr [, $offset = 0 ]); + +S::indexOf(string $str , string $substr [, $offset = 0 [, $encoding = null ]]) + +Returns the offset/index of the first occurrence of $substr in the string. +In case $substr is not a substring of the string, returns false. + +```php +S::create('string', 'UTF-8')->indexOf('ing'); +S::indexOf('string', 'ing', 0, 'UTF-8'); // 3 +``` + +#### indexOfLast + +$stringy->indexOfLast(string $substr [, $offset = 0 ]); + +S::indexOfLast(string $str , string $substr [, $offset = 0 [, $encoding = null ]]) + +Returns the offset/index of the last occurrence of $substr in the string. +In case $substr is not a substring of the string, returns false. + +```php +S::create('string', 'UTF-8')->indexOfLast('ing'); +S::indexOfLast('string string', 'ing', 0, 'UTF-8'); // 10 +``` + #### insert $stringy->insert(int $index, string $substring) diff --git a/src/StaticStringy.php b/src/StaticStringy.php index 78734db..6bde1eb 100644 --- a/src/StaticStringy.php +++ b/src/StaticStringy.php @@ -421,6 +421,34 @@ class StaticStringy ->containsAll($needles, $caseSensitive); } + /** + * Returns the offset/index of the first occurance of $substr in the string. + * In case $substr is not a substring of the string, returns false. + * + * @param string $str The haystack to search through + * @param string $substr substring + * @param int $offset + * @return int|bool + */ + public static function indexOf($str, $substr, $offset = 0, $encoding = null) + { + return Stringy::create($str, $encoding)->indexOf($substr, $offset); + } + + /** + * Returns the offset/index of the last occurance of $substr in the string. + * In case $substr is not a substring of the string, returns false. + * + * @param string $str The haystack to search through + * @param string $substr substring + * @param int $offset + * @return int|bool + */ + public static function indexOfLast($str, $substr, $offset = 0, $encoding = null) + { + return Stringy::create($str, $encoding)->indexOfLast($substr, $offset); + } + /** * Surrounds a string with the given substring. * diff --git a/src/Stringy.php b/src/Stringy.php index 785145a..a8a9c19 100644 --- a/src/Stringy.php +++ b/src/Stringy.php @@ -520,7 +520,7 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess 'Ἇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'Ᾰ', 'Ᾱ', 'Ὰ', 'Ά', 'ᾼ', 'А'), 'B' => array('Б', 'Β'), - 'C' => array('Ć', 'Č', 'Ĉ', 'Ċ'), + 'C' => array('Ç','Ć', 'Č', 'Ĉ', 'Ċ'), 'D' => array('Ď', 'Ð', 'Đ', 'Ɖ', 'Ɗ', 'Ƌ', 'ᴅ', 'ᴆ', 'Д', 'Δ'), 'E' => array('É', 'È', 'Ẻ', 'Ẽ', 'Ẹ', 'Ê', 'Ế', 'Ề', 'Ể', 'Ễ', 'Ệ', 'Ë', 'Ē', 'Ę', 'Ě', 'Ĕ', 'Ė', 'Ε', 'Έ', 'Ἐ', @@ -887,6 +887,32 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess return true; } + /** + * Returns the offset/index of the first occurrence of $substr in the string. + * In case $substr is not a substring of the string, returns false. + * + * @param string $substr substring + * @param int $offset + * @return int|bool + */ + public function indexOf($substr, $offset = 0) + { + return mb_strpos($this->str, (string)$substr, (int)$offset, $this->encoding); + } + + /** + * Returns the offset/index of the last occurrence of $substr in the string. + * In case $substr is not a substring of the string, returns false. + * + * @param string $substr substring + * @param int $offset + * @return int|bool + */ + public function indexOfLast($substr, $offset = 0) + { + return mb_strrpos($this->str, (string)$substr, (int)$offset, $this->encoding); + } + /** * Surrounds $str with the given substring. * diff --git a/tests/CommonTest.php b/tests/CommonTest.php index 9795702..a76bcf0 100644 --- a/tests/CommonTest.php +++ b/tests/CommonTest.php @@ -14,6 +14,26 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase $this->assertInstanceOf('Stringy\Stringy', $actual); } + public function indexOfProvider() + { + return array( + array(2, 'This is the string', 'is'), + array(2, 'This is the string', 'is', 0, 'UTF-8'), + array(false, 'This is the string', 'not-found', 0, 'UTF-8'), + array(32, 'This is the string... and there is another thing', 'is', 10, 'UTF-8'), + ); + } + + public function indexOfLastProvider() + { + return array( + array(5, 'This is the string', 'is'), + array(5, 'This is the string', 'is', 0, 'UTF-8'), + array(false, 'This is the string', 'not-found', 0, 'UTF-8'), + array(32, 'This is the string... and there is another thing', 'is', 0, 'UTF-8'), + ); + } + public function charsProvider() { return array( @@ -1023,4 +1043,5 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase array('fòô', 'bàř', '[[:alpha:]]{3}', 'fòô', 'msr', 'UTF-8') ); } + } diff --git a/tests/StaticStringyTest.php b/tests/StaticStringyTest.php index d8a4739..5f3c1f3 100644 --- a/tests/StaticStringyTest.php +++ b/tests/StaticStringyTest.php @@ -6,6 +6,24 @@ use Stringy\StaticStringy as S; class StaticStringyTestCase extends CommonTest { + /** + * @dataProvider indexOfProvider() + */ + public function testIndexOf($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::indexOf($str, $subStr, $offset, $encoding); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider indexOfLastProvider() + */ + public function testIndexOfLast($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::indexOfLast($str, $subStr, $offset, $encoding); + $this->assertEquals($expected, $result); + } + /** * @dataProvider charsProvider() */ @@ -647,4 +665,5 @@ class StaticStringyTestCase extends CommonTest $this->assertInternalType('string', $result); $this->assertEquals($expected, $result); } + } diff --git a/tests/StringyTest.php b/tests/StringyTest.php index 617c065..329ccc6 100644 --- a/tests/StringyTest.php +++ b/tests/StringyTest.php @@ -153,6 +153,24 @@ class StringyTestCase extends CommonTest unset($stringy[1]); } + /** + * @dataProvider indexOfProvider() + */ + public function testIndexOf($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::create($str, $encoding)->indexOf($subStr, $offset); + $this->assertEquals($expected, $result); + } + + /** + * @dataProvider indexOfLastProvider() + */ + public function testIndexOfLast($expected, $str, $subStr, $offset = 0, $encoding = null) + { + $result = S::create($str, $encoding)->indexOfLast($subStr, $offset); + $this->assertEquals($expected, $result); + } + /** * @dataProvider charsProvider() */ @@ -911,4 +929,5 @@ class StringyTestCase extends CommonTest $this->assertEquals($expected, $result); $this->assertEquals($str, $stringy); } + }