* $str = new Text('Hello World!');
* $str->at(6); // W * * $str = new Text('いちりんしゃ');
* $str->at(4) // し * * * @param int $index zero-related index * * @return string the found character */ public function at(int $index): string { return mb_substr($this->getString(), $index, 1, $this->encoding); } /** * Returns an ArrayObject consisting of the characters in the string. * * @return ArrayObject An ArrayObject of all chars */ public function chars(): ArrayObject { return new ArrayObject(mb_str_split($this->getString(), 1, $this->encoding)); } /** * Returns the index of a given string, starting at the optional zero-related offset * * @param string|Stringable $string * @param int $offset zero-related offset * * @return int|null int for the index or null if the given string doesn't occur */ public function indexOf(string|Stringable $string, int $offset = 0): ?int { $output = mb_strpos($this->getString(), (string) $string, $offset, $this->encoding); return false === $output ? null : $output; } /** * Returns the last index of a given string, starting at the optional offset * * @param string|Stringable $string $string * @param int|null $offset * * @return int|null int for the index or null if the given string doesn't occur */ public function lastIndexOf(string|Stringable $string, ?int $offset = null): ?int { if (null === $offset) { $offset = $this->length(); } // Converts $offset to a negative offset as strrpos has a different // behavior for positive offsets. $output = mb_strrpos($this->getString(), (string) $string, $offset - $this->length(), $this->encoding); return false === $output ? null : $output; } /** * Checks whether the string starts with the given string. Case sensitive! * * @param string|Stringable $substring The substring to look for * * @return bool * * @see Text::startsWithIgnoreCase() * */ public function startsWith(string|Stringable $substring): bool { return str_starts_with($this->getString(), (string) $substring); } /** * Checks whether the string starts with the given string. Ignores case. * * @param string|Stringable $substring The substring to look for * * @return bool * * @see Text::startsWith() * */ public function startsWithIgnoreCase(string|Stringable $substring): bool { return str_starts_with($this->toUpperCase()->getString(), mb_strtoupper((string) $substring, $this->encoding)); } /** * Checks whether the string ends with the given string. Case sensitive! * * @param string|Stringable $substring The substring to look for * * @return bool * * @see Text::endsWithIgnoreCase() * */ public function endsWith(string|Stringable $substring): bool { return str_ends_with($this->getString(), (string) $substring); } /** * Checks whether the string ends with the given string. Ingores case. * * @param string|Stringable $substring The substring to look for * * @return bool * * @see Text::endsWith() * */ public function endsWithIgnoreCase(string|Stringable $substring): bool { return str_ends_with($this->toUpperCase()->getString(), mb_strtoupper((string) $substring, $this->encoding)); } /** * Checks whether the given string occurs * * @param string|Stringable $text * * @return bool */ public function contains(Stringable|string $text): bool { return str_contains($this->getString(), (string) $text); } /** * Performs a regular expression matching with the given regexp * * @param string $regexp * * @return bool */ public function match(string $regexp): bool { return (bool) preg_match($regexp, $this->getString()); } }