{"id":19039569,"url":"https://github.com/windwalker-io/string","last_synced_at":"2026-04-10T10:02:33.022Z","repository":{"id":20975715,"uuid":"24264724","full_name":"windwalker-io/string","owner":"windwalker-io","description":"[DEPRECATED] A library to manmipulate UTF-8 string and some advanced string operations. ","archived":false,"fork":false,"pushed_at":"2023-03-06T04:55:12.000Z","size":7320,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-01-02T09:23:00.695Z","etag":null,"topics":["php","string","string-class","string-manipulation"],"latest_commit_sha":null,"homepage":"https://github.com/ventoviro/windwalker","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/windwalker-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-09-20T14:23:50.000Z","updated_at":"2024-12-16T13:47:36.000Z","dependencies_parsed_at":"2025-04-17T17:13:10.211Z","dependency_job_id":"bca9d58b-14b1-41f2-b78b-b9cd1b4f0c77","html_url":"https://github.com/windwalker-io/string","commit_stats":null,"previous_names":["ventoviro/windwalker-string"],"tags_count":80,"template":false,"template_full_name":null,"purl":"pkg:github/windwalker-io/string","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windwalker-io%2Fstring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windwalker-io%2Fstring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windwalker-io%2Fstring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windwalker-io%2Fstring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/windwalker-io","download_url":"https://codeload.github.com/windwalker-io/string/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/windwalker-io%2Fstring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31637748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["php","string","string-class","string-manipulation"],"created_at":"2024-11-08T22:17:41.161Z","updated_at":"2026-04-10T10:02:32.846Z","avatar_url":"https://github.com/windwalker-io.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Windwalker String\n\nWindwalker String package provides UTF-8 string operation, it is a Joomla String fork but added more functions.\n\n## Installation via Composer\n\nAdd this to the require block in your `composer.json`.\n\n``` json\n{\n    \"require\": {\n        \"windwalker/string\": \"~3.0\"\n    }\n}\n```\n\n## New Str Class\n\nAfter 3.2, Windwalker has a new `Str` class and we will continue replace all old `StringHelper` will it in the future:\n\n```php\nuse Windwalker\\String\\Str;\n\nstring : Str::getChar($string, $pos, $encoding = null);\nstring : Str::between($string, $start, $end, $offset = 0, $encoding = null);\nstring : Str::collapseWhitespaces($string);\nbool :   Str::contains($string, $search, $caseSensitive = true, $encoding = null);\nbool :   Str::endsWith($string, $search, $caseSensitive = true, $encoding = null);\nbool :   Str::startsWith($string, $target, $caseSensitive = true, $encoding = null);\nstring : Str::ensureLeft($string, $search, $encoding = null);\nstring : Str::ensureRight($string, $search, $encoding = null);\nbool :   Str::hasLowerCase($string, $encoding = null);\nbool :   Str::hasUpperCase($string, $encoding = null);\nbool :   Str::match($pattern, $string, $option = 'msr', $encoding = null);\nstring : Str::insert($string, $insert, $position, $encoding = null);\nbool :   Str::isLowerCase($string);\nbool :   Str::isUpperCase($string);\nstring : Str::first($string, $length = 1, $encoding = null);\nstring : Str::last($string, $length = 1, $encoding = null);\nstring : Str::intersectLeft($string1, $string2, $encoding = null);\nstring : Str::intersectRight($string1, $string2, $encoding = null);\nstring : Str::intersect($string1, $string2, $encoding = null);\nstring : Str::pad($string, $length = 0, $substring = ' ', $encoding = null);;\nstring : Str::padLeft($string, $length = 0, $substring = ' ', $encoding = null);;\nstring : Str::padRight($string, $length = 0, $substring = ' ', $encoding = null);;\nstring : Str::removeChar($string, $offset, $length = null, $encoding = null);\nstring : Str::removeLeft($string, $search, $encoding = null);\nstring : Str::removeRight($string, $search, $encoding = null);\nstring : Str::slice($string, $start, $end = null, $encoding = null);\nstring : Str::substring($string, $start, $end = null, $encoding = null);\nstring : Str::surround($string, $substring = ['\"', '\"']);\nstring : Str::toggleCase($string, $encoding = null);\nstring : Str::truncate();;\nstring : Str::map($string, callable $callback, $encoding = null);\nstring : Str::filter($string, callable $callback, $encoding = null);\nstring : Str::reject($string, callable $callback, $encoding = null);\n```\n\n## New StringObject\n\n`StringObject` is a class to help us manipulation string by OO way.\n\nCreate string object:\n\n```php\n$str = str('Hello');\n\n// OR\n\n$str = new StringObject('Hello');\n$str = StringObject::create('Hello');\n```\n\n### Usage\n\n```php\n$str[3]; // Get letter\n\n// Iterator\nforeach ($str as $letter)\n{\n    echo $letter\n}\n\n// Chaining modify, it is a immutable object, must reuturn self.\n$str = $str-\u003etoUpperCase()\n    -\u003etrimLeft()\n    -\u003etruncate();\n    \n// to string\necho $str;\n```\n\n### Methods\n\n```php\n$str-\u003ecount();\n$str-\u003egetString();\n$str-\u003ewithString($string);\n$str-\u003etoLowerCase();\n$str-\u003etoUpperCase();\n$str-\u003elength();\n$str-\u003echop($length = 1);\n$str-\u003ereplace($search, $replacement, \u0026$count = null);\n$str-\u003ecompare($compare, $caseSensitive = true);\n$str-\u003ereverse();\n$str-\u003esubstrReplace($replace, $start, $offset = null);\n$str-\u003etrimLeft($charlist = null);\n$str-\u003etrimRight($charlist = null);\n$str-\u003etrim($charlist = null);\n$str-\u003eupperCaseFirst();\n$str-\u003elowerCaseFirst();\n$str-\u003eupperCaseWords();\n$str-\u003esubstrCount($search, $caseSensitive = true);\n$str-\u003eindexOf($search);\n$str-\u003eindexOfLast($search);\n$str-\u003eexplode($delimiter, $limit = null);\n$str-\u003eapply(callable $callback);\n$str-\u003egetChar(int $pos);\n$str-\u003ebetween(string $start, string $end, int $offset = 0);\n$str-\u003ecollapseWhitespaces(string $string);\n$str-\u003econtains(string $search, bool $caseSensitive = true);\n$str-\u003eendsWith(string $search, bool $caseSensitive = true);\n$str-\u003estartsWith(string $target, bool $caseSensitive = true);\n$str-\u003eensureLeft(string $search);\n$str-\u003eensureRight(string $search);\n$str-\u003ehasLowerCase();\n$str-\u003ehasUpperCase();\n$str-\u003ematch(string $pattern, string $option = 'msr');\n$str-\u003einsert(string $insert, int $position);\n$str-\u003eisLowerCase();\n$str-\u003eisUpperCase();\n$str-\u003efirst(int $length = 1);\n$str-\u003elast(int $length = 1);\n$str-\u003eintersectLeft(string $string2);\n$str-\u003eintersectRight(string $string2);\n$str-\u003eintersect(string $string2);\n$str-\u003epad(int $length = 0, string $substring = ' ');\n$str-\u003epadLeft(int $length = 0, string $substring = ' ');\n$str-\u003epadRight(int $length = 0, string $substring = ' ');\n$str-\u003eremoveChar(int $offset, int $length = null);\n$str-\u003eremoveLeft(string $search);\n$str-\u003eremoveRight(string $search);\n$str-\u003eslice(int $start, int $end = null);\n$str-\u003esubstring(int $start, int $end = null);\n$str-\u003esurround($substring = ['\"', '\"']);\n$str-\u003etoggleCase();\n$str-\u003etruncate(int $length, string $suffix = '', bool $wordBreak = true);\n$str-\u003emap(callable $callback);\n$str-\u003efilter(callable $callback);\n$str-\u003ereject(callable $callback);\n```\n\n## Simple Template Engine\n\nSimple variable replace.\n\n``` php\nuse Windwalker\\String\\SimpleTemplate;\n\n$string = 'Hello my name is: {{ name }}~~~!!!';\n\nSimpleTemplate::render($string, array('name' =\u003e 'Simon')); // Hello my name is Simon~~~!!!\n```\n\nMulti-level variable.\n\n``` php\n$string = 'Hello my name is: {{ user.name }} and ID is: {{ user.id }}~~~!!!';\n\n$array = array(\n    'user' =\u003e array(\n        'name' =\u003e 'Simon',\n        'id' =\u003e 123\n    )\n);\n\nSimpleTemplate::render($string, $array); // Hello my name is Simon and ID is: 123~~~!!!\n```\n\nCustom Tags:\n\n\n``` php\n$string = 'Hello my name is: {$ name $}~~~!!!';\n\nSimpleTemplate::render($string, array('name' =\u003e 'Simon'), array('{$', '$}'); // Hello my name is Simon~~~!!!\n```\n\n## Utf8String\n\nUtf8String is a wrap of `phputf8` library:\n\n``` php\nuse Windwalker\\String\\Utf8String;\n\n$string = '這是一個最美的小情歌';\n\nUtf8String::substr($string, 0, 5); // '這是一個最'\nUtf8String::strlen($string); // 10\n\n// More methods\nUtf8String::is_ascii($string);\n\nUtf8String::strpos($str, $search, $offset = false);\n\nUtf8String::strrpos($str, $search, $offset = 0);\n\nUtf8String::strtolower($string);\n\nUtf8String::strtoupper($string);\n\nUtf8String::str_ireplace($search, $replace, $str, $count = null);\n\nUtf8String::str_split($str, $split_len = 1);\n\nUtf8String::strcasecmp($str1, $str2, $locale = false);\n\nUtf8String::strcmp($str1, $str2, $locale = false);\n\nUtf8String::strcspn($str, $mask, $start = null, $length = null);\n\nUtf8String::stristr($str, $search);\n\nUtf8String::strrev($string);\n\nUtf8String::strspn($str, $mask, $start = null, $length = null);\n\nUtf8String::substr_replace($str, $repl, $start, $length = null);\n\nUtf8String::ltrim($str, $charlist = null);\n\nUtf8String::rtrim($str, $charlist = null);\n\nUtf8String::trim($str, $charlist = null);\n\nUtf8String::ucfirst($str, $delimiter = null, $newDelimiter = null);\n\nUtf8String::ucwords($string);\n\nUtf8String::transcode($source, $from_encoding, $to_encoding); // Equals to iconv())\n\nUtf8String::valid($string);\n\nUtf8String::compliant($string);\n\nUtf8String::unicode_to_utf8($string);\n\nUtf8String::unicode_to_utf16($string);\n```\n\n## StringHelper\n\n### Empty String Determine\n\nisEmpty()\n\n``` php\nuse Windwalker\\String\\StringHelper;\n\nStringHelper::isEmpty('');      // true\nStringHelper::isEmpty(0);       // false\nStringHelper::isEmpty(array()); // true\nStringHelper::isEmpty(null);    // true\n```\n\nisZero()\n\n``` php\nStringHelper::isZero(0);    // true\nStringHelper::isZero('0');  // true\nStringHelper::isZero('');   // false\nStringHelper::isZero(null); // false\n```\n\n### Quote\n\nAn useful method to quate a string.\n\n``` php\n// Default quote is `\"`\nStringHelper::quote('foo'); // \"foo\"\n\n// Custom quotes\nStringHelper::quote('foo', array('{{', '}}')); // {{foo}}\n\n// Backquote\nStringHelper::backquote('foo'); // `foo`\n```\n\n### More Methods\n\nincrement()\n\n``` php\nStringHelper::increment('Title'); // Title (2)\nStringHelper::increment('Title', StringHelper::INCREMENT_STYLE_DASH); // Title-2\n```\n\nat()\n\n``` php\nStringHelper::at('歡迎光臨', 2); // 光\n```\n\ncollapseWhitespace()\n\n``` php\nStringHelper::collapseWhitespace('Welcome   to   Windwalker'); // 'Welcome to Windwalker'\n```\n\nendsWith()\n\n``` php\nStringHelper::endsWith('歡迎光臨', '光臨' [, $caseSensive = true]); // true\n```\n\nstartsWith()\n\n``` php\nStringHelper::startsWith('歡迎光臨', '歡迎' [, $caseSensive = true]); // true\n```\n\n``` php\n// Default callback is array_push\nStringHelper::explode('.', 'foo.bar', 3); // array('foo', 'bar', null);\n\n// Shift null\nStringHelper::explode('.', 'foo.bar', 3, 'array_shift'); // array(null, 'foo', 'bar');\n\n// Limit\nStringHelper::explode('.', 'foo.bar.yoo', 2); // array('foo', 'bar.yoo');\n\n// Useful to use list()\n\nlist($foo, $bar, $yoo) = StringHelper::explode('.', 'foo.bar', 3);\n```\n\n## StringInflector\n\n``` php\nuse Windwalker\\String\\StringInflector;\n\n$inflector = StringInflector::getInstance();\n$string = 'category';\n\nif ($inflector-\u003eisSingular($string))\n{\n    $string = $inflector-\u003etoPular(); // categories\n}\n\nif ($inflector-\u003eisPlural($string))\n{\n    $string = $inflector-\u003etoSingular(); // category\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwindwalker-io%2Fstring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwindwalker-io%2Fstring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwindwalker-io%2Fstring/lists"}