--- /dev/null
+<?php
+
+final class StringTools
+{
+ public static function startsWith($haystack, $needle)
+ {
+ return !strncmp($haystack, $needle, strlen($needle));
+ }
+
+ public static function endsWith($haystack, $needle)
+ {
+ $length = strlen($needle);
+ return !$length || substr($haystack, -$length) === $needle;
+ }
+}
+
--- /dev/null
+<?php
+
+class StringToolsTest extends PHPUnit_Framework_TestCase
+{
+ public function testStartsWith()
+ {
+ $this->assertTrue(StringTools::startsWith('abcdef', 'abc'));
+ $this->assertFalse(StringTools::startsWith(' abcdef', 'abc'));
+ $this->assertFalse(StringTools::startsWith('abc', 'abcdef'));
+ $this->assertTrue(StringTools::startsWith('abc', 'abc'));
+ $this->assertTrue(StringTools::startsWith('abc', ''));
+ $this->assertFalse(StringTools::startsWith('abc', ' '));
+ }
+
+ public function testEndsWith()
+ {
+ $this->assertTrue(StringTools::endsWith('abcdef', 'def'));
+ $this->assertFalse(StringTools::endsWith('abcdef ', 'def'));
+ $this->assertFalse(StringTools::endsWith('abc', 'abcdef'));
+ $this->assertTrue(StringTools::endsWith('abc', 'abc'));
+ $this->assertTrue(StringTools::endsWith('abc', ''));
+ $this->assertFalse(StringTools::endsWith('abc', ' '));
+ }
+}
+