takeit/stringy

支持多字节字符串操作库

3.1.0 2017-06-12 01:10 UTC

README

Stringy

一个支持多字节字符串操作的PHP库。兼容PHP 5.4+、PHP 7+和HHVM。

s('string')->toTitleCase()->ensureRight('y') == 'Stringy'

请参考1.x分支2.x分支获取旧版文档。

Build Status Total Downloads License

为什么?

部分原因是PHP许多标准字符串函数对多字节支持(包括UTF-8)不足。同时,为了提供对mbstring模块多字节兼容函数的OO封装。Stringy处理了一些怪癖,提供了额外的功能,并希望使字符串操作更加容易!

// Standard library
strtoupper('fòôbàř');       // 'FòôBàř'
strlen('fòôbàř');           // 10

// mbstring
mb_strtoupper('fòôbàř');    // 'FÒÔBÀŘ'
mb_strlen('fòôbàř');        // '6'

// Stringy
s('fòôbàř')->toUpperCase(); // 'FÒÔBÀŘ'
s('fòôbàř')->length();      // '6'

安装

如果您使用Composer来管理依赖项,您可以在composer.json文件中包含以下内容

"require": {
    "danielstjules/stringy": "~3.1.0"
}

然后,在运行composer updatephp composer.phar update之后,您可以使用Composer的自动加载来加载类

require 'vendor/autoload.php';

否则,您可以直接要求文件

require_once 'path/to/Stringy/src/Stringy.php';

在两种情况下,我建议使用别名。

use Stringy\Stringy as S;

请注意,Stringy依赖于mbstring模块来实现其底层多字节支持。如果找不到该模块,Stringy将使用symfony/polyfill-mbstring。ex-mbstring是一个非默认但非常常见的模块。例如,在debian和ubuntu中,它包含在libapache2-mod-php5、php5-cli和php5-fpm中。对于OSX用户,它是对任何通过homebrew安装的PHP版本的默认设置。如果从头编译PHP,可以使用--enable-mbstring标志将其包含在内。

面向对象和链式调用

该库提供OO方法链,如下所示

use Stringy\Stringy as S;
echo S::create('fòô     bàř')->collapseWhitespace()->swapCase(); // 'FÒÔ BÀŘ'

Stringy\Stringy有一个__toString()方法,当对象在字符串上下文中使用时返回当前字符串,即:(string) S::create('foo') // 'foo'

实现接口

Stringy\Stringy实现了IteratorAggregate接口,这意味着可以使用类实例与foreach一起使用

$stringy = S::create('fòôbàř');
foreach ($stringy as $char) {
    echo $char;
}
// 'fòôbàř'

它实现了Countable接口,允许使用count()获取字符串中的字符数

$stringy = S::create('fòô');
count($stringy);  // 3

此外,实现了ArrayAccess接口。因此,可以使用isset()来检查特定索引处的字符是否存在。由于Stringy\Stringy是不可变的,因此对offsetSetoffsetUnset的任何调用都会抛出异常。offsetGet已实现,并且接受正负索引。无效索引会导致OutOfBoundsException

$stringy = S::create('bàř');
echo $stringy[2];     // 'ř'
echo $stringy[-2];    // 'à'
isset($stringy[-4]);  // false

$stringy[3];          // OutOfBoundsException
$stringy[2] = 'a';    // Exception

PHP 5.6创建

自PHP 5.6以来,use function可用于导入函数。Stringy公开了一个命名空间函数Stringy\create,它产生与Stringy\Stringy::create()相同的行为。如果运行PHP 5.6或支持use function语法的其他运行时,您可以利用更简单的API,如下所示

use function Stringy\create as s;

// Instead of: S::create('fòô     bàř')
s('fòô     bàř')->collapseWhitespace()->swapCase();

StaticStringy

下述“实例方法”中列出的所有方法都是静态包装器的一部分。对于StaticStringy方法,期望的编码是最后一个参数。返回值不会被强制类型转换,因此可能是Stringy、整数、布尔值等类型。

use Stringy\StaticStringy as S;

// Translates to Stringy::create('fòôbàř')->slice(0, 3);
// Returns a Stringy object with the string "fòô"
S::slice('fòôbàř', 0, 3);

类方法

create(mixed $str [, $encoding ])

创建一个Stringy对象,并将提供的值分配给str和encoding属性。在赋值之前,将$str转换为字符串,如果未指定$encoding,则默认为mb_internal_encoding()。然后返回初始化后的对象。如果第一个参数是数组或没有__toString方法的对象,则抛出InvalidArgumentException异常。

$stringy = S::create('fòôbàř'); // 'fòôbàř'

实例方法

Stringy对象是不可变的。以下所有示例都使用了PHP 5.6函数导入和PHP 5.4简化的数组语法。它们还假定mb_internal_encoding()返回的编码是UTF-8。有关更多信息,请参阅上面创建方法的文档以及PHP 5.6创建的说明。

append(string $string)

返回一个新字符串,其中包含附加的$string。

s('fòô')->append('bàř'); // 'fòôbàř'
at(int $index)

返回索引为$index的字符,索引从0开始。

s('fòôbàř')->at(3); // 'b'
between(string $start, string $end [, int $offset])

如果找到,返回$start和$end之间的子字符串,否则返回空字符串。可以提供一个可选的偏移量,从该偏移量开始搜索起始字符串。

s('{foo} and {bar}')->between('{', '}'); // 'foo'
camelize()

返回一个驼峰式的字符串。删除周围的空格,将数字、空格、破折号和下划线后面的字母转换为大写,并删除空格、破折号以及下划线。

s('Camel-Case')->camelize(); // 'camelCase'
chars()

返回一个包含字符串中字符的数组。

s('fòôbàř')->chars(); // ['f', 'ò', 'ô', 'b', 'à', 'ř']
collapseWhitespace()

删除字符串,并将连续的空白字符替换为单个空格。这包括制表符和换行符,以及多字节空白字符,如细空格和表意空格。

s('   Ο     συγγραφέας  ')->collapseWhitespace(); // 'Ο συγγραφέας'
contains(string $needle [, boolean $caseSensitive = true ])

如果字符串包含$needle,则返回true,否则返回false。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('Ο συγγραφέας είπε')->contains('συγγραφέας'); // true
containsAll(array $needles [, boolean $caseSensitive = true ])

如果字符串包含所有$needles,则返回true,否则返回false。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('foo & bar')->containsAll(['foo', 'bar']); // true
containsAny(array $needles [, boolean $caseSensitive = true ])

如果字符串包含任何$needles,则返回true,否则返回false。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('str contains foo')->containsAny(['foo', 'bar']); // true
countSubstr(string $substring [, boolean $caseSensitive = true ])

返回给定字符串中$substring的出现的次数。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('Ο συγγραφέας είπε')->countSubstr('α'); // 2
dasherize()

返回一个由破折号分隔的小写和修剪过的字符串。在字符串的第一个字符之外,破折号插入到大写字母之前,并替换空格以及下划线。

s('fooBar')->dasherize(); // 'foo-bar'
delimit(int $delimiter)

返回一个由指定分隔符分隔的小写和修剪过的字符串。分隔符插入到大写字母之前(除了字符串的第一个字符),以及替换空格、破折号和下划线。字母分隔符不转换为小写。

s('fooBar')->delimit('::'); // 'foo::bar'
endsWith(string $substring [, boolean $caseSensitive = true ])

如果字符串以$substring结束,则返回true,否则返回false。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('fòôbàř')->endsWith('bàř'); // true
endsWithAny(string[] $substrings [, boolean $caseSensitive = true ])

如果字符串以任何$substrings结束,则返回true,否则返回false。默认情况下,比较是区分大小写的,但可以通过将$caseSensitive设置为false来使比较不区分大小写。

s('fòôbàř')->endsWithAny(['bàř', 'baz']); // true
ensureLeft(string $substring)

确保字符串以$substring开始。如果不以$substring开始,则将其前置。

s('foobar')->ensureLeft('http://'); // 'http://foobar'
ensureRight(string $substring)

确保字符串以$substring结束。如果不以$substring结束,则将其后置。

s('foobar')->ensureRight('.com'); // 'foobar.com'
first(int $n)

返回字符串的前$n个字符。

s('fòôbàř')->first(3); // 'fòô'
getEncoding()

返回Stringy对象使用的编码。

s('fòôbàř')->getEncoding(); // 'UTF-8'
hasLowerCase()

如果字符串包含小写字母,则返回 true,否则返回 false。

s('fòôbàř')->hasLowerCase(); // true
hasUpperCase()

如果字符串包含大写字母,则返回 true,否则返回 false。

s('fòôbàř')->hasUpperCase(); // false
htmlDecode()

将所有 HTML 实体转换为相应的字符。是 html_entity_decode 的别名。有关标志列表,请参阅 https://php.ac.cn/manual/en/function.html-entity-decode.php

s('&')->htmlDecode(); // '&'
htmlEncode()

将所有适用的字符转换为 HTML 实体。是 htmlentities 的别名。有关标志列表,请参阅 https://php.ac.cn/manual/en/function.htmlentities.php

s('&')->htmlEncode(); // '&'
humanize()

将字符串的第一个单词首字母大写,将下划线替换为空格,并移除 '_id'。

s('author_id')->humanize(); // 'Author'
indexOf(string $needle [, $offset = 0 ]);

返回 $needle 在字符串中的第一个出现位置的索引,如果未找到则返回 false。接受一个可选的偏移量,从该偏移量开始搜索。负索引从字符串末尾开始搜索

s('string')->indexOf('ing'); // 3
indexOfLast(string $needle [, $offset = 0 ]);

返回 $needle 在字符串中最后出现位置的索引,如果未找到则返回 false。接受一个可选的偏移量,从该偏移量开始搜索。偏移量可以是负数,以便从字符串的最后一个字符开始计数。

s('foobarfoo')->indexOfLast('foo'); // 10
insert(int $index, string $substring)

在提供的 $index 位置插入 $substring 到字符串中。

s('fòôbř')->insert('à', 4); // 'fòôbàř'
isAlpha()

如果字符串只包含字母字符,则返回 true,否则返回 false。

s('丹尼爾')->isAlpha(); // true
isAlphanumeric()

如果字符串只包含字母和数字字符,则返回 true,否则返回 false。

s('دانيال1')->isAlphanumeric(); // true
isBase64()

如果字符串是 base64 编码的,则返回 true,否则返回 false。

s('Zm9vYmFy')->isBase64(); // true
isBlank()

如果字符串只包含空白字符,则返回 true,否则返回 false。

s("\n\t  \v\f")->isBlank(); // true
isHexadecimal()

如果字符串只包含十六进制字符,则返回 true,否则返回 false。

s('A102F')->isHexadecimal(); // true
isJson()

如果字符串是 JSON,则返回 true,否则返回 false。与 PHP 5.x 中的 json_decode 不同,此方法与 PHP 7 和其他 JSON 解析器保持一致,即空字符串不被视为有效的 JSON。

s('{"foo":"bar"}')->isJson(); // true
isLowerCase()

如果字符串只包含小写字母字符,则返回 true,否则返回 false。

s('fòôbàř')->isLowerCase(); // true
isSerialized()

如果字符串是序列化的,则返回 true,否则返回 false。

s('a:1:{s:3:"foo";s:3:"bar";}')->isSerialized(); // true
isUpperCase()

如果字符串只包含大写字母字符,则返回 true,否则返回 false。

s('FÒÔBÀŘ')->isUpperCase(); // true
last(int $n)

返回字符串的最后 $n 个字符。

s('fòôbàř')->last(3); // 'bàř'
length()

返回字符串的长度。是 PHP 的 mb_strlen() 函数的别名。

s('fòôbàř')->length(); // 6
lines()

按换行符和回车换行符分割,返回一个包含对应于字符串中行的 Stringy 对象数组的数组。

s("fòô\r\nbàř\n")->lines(); // ['fòô', 'bàř', '']
longestCommonPrefix(string $otherStr)

返回字符串和 $otherStr 之间的最长公共前缀。

s('foobar')->longestCommonPrefix('foobaz'); // 'fooba'
longestCommonSuffix(string $otherStr)

返回字符串和 $otherStr 之间的最长公共后缀。

s('fòôbàř')->longestCommonSuffix('fòrbàř'); // 'bàř'
longestCommonSubstring(string $otherStr)

返回字符串和 $otherStr 之间的最长公共子串。在存在平局的情况下,它返回第一个出现的那个。

s('foobar')->longestCommonSubstring('boofar'); // 'oo'
lowerCaseFirst()

将提供的字符串的第一个字符转换为小写。

s('Σ foo')->lowerCaseFirst(); // 'σ foo'
pad(int $length [, string $padStr = ' ' [, string $padType = 'right' ]])

使用 $padStr 补充字符串到指定长度。如果长度小于或等于字符串长度,则不进行填充。默认的填充字符串是一个空格,默认的类型('left', 'right', 'both' 中的一种)是 'right'。如果 $padType 不是这 3 个值之一,则抛出 InvalidArgumentException。

s('fòôbàř')->pad(9, '-/', 'left'); // '-/-fòôbàř'
padBoth(int $length [, string $padStr = ' ' ])

返回一个长度为给定长度的新字符串,使得字符串的两端都进行填充。是 pad() 的别名,其中 $padType 为 'both'。

s('foo bar')->padBoth(9, ' '); // ' foo bar '
padLeft(int $length [, string $padStr = ' ' ])

返回一个长度给定的新字符串,使得字符串的开头被填充。pad()函数的别名,其中$padType为'left'。

s('foo bar')->padLeft(9, ' '); // '  foo bar'
padRight(int $length [, string $padStr = ' ' ])

返回一个长度给定的新字符串,使得字符串的末尾被填充。pad()函数的别名,其中$padType为'right'。

s('foo bar')->padRight(10, '_*'); // 'foo bar_*_'
prepend(string $string)

返回一个以$string开始的新字符串。

s('bàř')->prepend('fòô'); // 'fòôbàř'
regexReplace(string $pattern, string $replacement [, string $options = 'msr'])

将$pattern在$str中所有出现的位置替换为$replacement。是mb_ereg_replace()的别名。注意,mb_ereg_replace()中的'i'选项在多字节模式中需要PHP 5.6+才能得到正确结果。这是由于PHP < 5.6捆绑的Oniguruma版本不支持,以及HHVM(3.8和以下版本)的当前版本。

s('fòô ')->regexReplace('f[òô]+\s', 'bàř'); // 'bàř'
s('')->regexReplace('(ò)', '\\'); // 'fòô'
removeLeft(string $substring)

返回一个新字符串,如果存在,将移除前缀$substring。

s('fòôbàř')->removeLeft('fòô'); // 'bàř'
removeRight(string $substring)

返回一个新字符串,如果存在,将移除后缀$substring。

s('fòôbàř')->removeRight('bàř'); // 'fòô'
repeat(int $multiplier)

返回一个给定乘数重复的字符串。是str_repeat的别名。

s('α')->repeat(3); // 'ααα'
replace(string $search, string $replacement)

将$str中所有$search出现的位置替换为$replacement。

s('fòô bàř fòô bàř')->replace('fòô ', ''); // 'bàř bàř'
reverse()

返回一个反转的字符串。是strrev()的多字节版本。

s('fòôbàř')->reverse(); // 'řàbôòf'
safeTruncate(int $length [, string $substring = '' ])

将字符串截断到给定长度,同时确保不拆分单词。如果提供了$substring,并且发生了截断,字符串将进一步截断,以便可以附加子字符串而不会超过所需的长度。

s('What are your plans today?')->safeTruncate(22, '...');
// 'What are your plans...'
shuffle()

多字节str_shuffle()函数。它返回一个字符随机顺序的字符串。

s('fòôbàř')->shuffle(); // 'àôřbòf'
slugify([, string $replacement = '-' [, string $language = 'en']])

将字符串转换为URL别名。这包括用ASCII等价物替换非ASCII字符,移除剩余的非ASCII和非字母数字字符,并用$replacement替换空白。默认替换为单个连字符,并将字符串转换为小写。还可以提供源字符串的语言,以便进行特定语言的转写。

s('Using strings like fòô bàř')->slugify(); // 'using-strings-like-foo-bar'
slice(int $start [, int $end ])

返回从$start开始的子字符串,直到但不包括由$end指定的索引。如果省略$end,则提取剩余的字符串。如果$end为负,则从字符串的末尾计算。

s('fòôbàř')->slice(3, -1); // 'bà'
split(string $pattern [, int $limit ])

使用提供的正则表达式分割字符串,返回一个Stringy对象数组。可选整数$limit将截断结果。

s('foo,bar,baz')->split(',', 2); // ['foo', 'bar']
startsWith(string $substring [, boolean $caseSensitive = true ])

如果字符串以$substring开头,则返回true,否则返回false。默认情况下,比较是大小写敏感的,但可以通过将$caseSensitive设置为false来使其不敏感。

s('FÒÔbàřbaz')->startsWith('fòôbàř', false); // true
startsWithAny(string[] $substrings [, boolean $caseSensitive = true ])

如果字符串以任何$substrings开头,则返回true,否则返回false。默认情况下,比较是大小写敏感的,但可以通过将$caseSensitive设置为false来使其不敏感。

s('FÒÔbàřbaz')->startsWithAny(['fòô', 'bàř'], false); // true
stripWhitespace()

删除所有空白字符。这包括制表符和换行符,以及多字节空白,如细空格和表意空格。

s('   Ο     συγγραφέας  ')->stripWhitespace(); // 'Οσυγγραφέας'
substr(int $start [, int $length ])

返回从$start开始的指定$length的子字符串。它与mb_substr()函数不同,提供$length为null时将返回剩余的字符串,而不是空字符串。

s('fòôbàř')->substr(2, 3); // 'ôbà'
surround(string $substring)

用给定的子字符串包围字符串。

s(' ͜ ')->surround('ʘ'); // 'ʘ ͜ ʘ'
swapCase()

返回字符串的大小写交换版本。

s('Ντανιλ')->swapCase(); // 'νΤΑΝΙΛ'
tidy()

返回一个字符串,其中将Windows-1252(通常用于Word文档)中的智能引号、省略号字符和连字符替换为其ASCII等价物。

s('“I see…”')->tidy(); // '"I see..."'
titleize([, array $ignore])

返回一个每个单词首字母大写的修剪字符串。同时接受一个数组 $ignore,允许您列出不需要大写的单词。

$ignore = ['at', 'by', 'for', 'in', 'of', 'on', 'out', 'to', 'the'];
s('i like to watch television')->titleize($ignore);
// 'I Like to Watch Television'
toAscii([, string $language = 'en' [, bool $removeUnsupported = true ]])

返回字符串的ASCII版本。一些非ASCII字符被替换为它们最接近的ASCII对应字符,其余字符默认删除。可以提供源字符串的语言或区域设置,以进行语言特定的转写,以下格式之一:en, en_GB, 或 en-GB。例如,传递 "de" 将导致 "äöü" 映射到 "aeoeue",而不是像其他语言中的 "aou"。

s('fòôbàř')->toAscii(); // 'foobar'
s('äöü')->toAscii(); // 'aou'
s('äöü')->toAscii('de'); // 'aeoeue'
toBoolean()

返回给定逻辑字符串值的布尔表示。例如,'true'、'1'、'on' 和 'yes' 将返回 true。'false'、'0'、'off' 和 'no' 将返回 false。在所有情况下,大小写将被忽略。对于其他数字字符串,它们的符号将决定返回值。此外,仅由空白组成的空字符串将返回 false。对于所有其他字符串,返回值是布尔转换的结果。

s('OFF')->toBoolean(); // false
toLowerCase()

将字符串中的所有字符转换为小写。PHP的mb_strtolower()的别名。

s('FÒÔBÀŘ')->toLowerCase(); // 'fòôbàř'
toSpaces([, tabLength = 4 ])

将字符串中的每个制表符转换为由$tabLength定义的空格数。默认情况下,每个制表符转换为4个连续空格。

s(' String speech = "Hi"')->toSpaces(); // '    String speech = "Hi"'
toTabs([, tabLength = 4 ])

将定义为$tabLength的连续空格数转换为制表符。默认情况下,每个4个连续空格转换为制表符。

s('    fòô    bàř')->toTabs();
// '   fòô bàř'
toTitleCase()

将字符串中每个单词的首字符转换为大写。

s('fòô bàř')->toTitleCase(); // 'Fòô Bàř'
toUpperCase()

将字符串中的所有字符转换为大写。PHP的mb_strtoupper()的别名。

s('fòôbàř')->toUpperCase(); // 'FÒÔBÀŘ'
trim([, string $chars])

返回从字符串开头和结尾删除空格的字符串。支持删除Unicode空白。接受一个可选的字符字符串来替换默认值。

s('  fòôbàř  ')->trim(); // 'fòôbàř'
trimLeft([, string $chars])

返回从字符串开头删除空白的字符串。支持删除Unicode空白。接受一个可选的字符字符串来替换默认值。

s('  fòôbàř  ')->trimLeft(); // 'fòôbàř  '
trimRight([, string $chars])

返回从字符串结尾删除空白的字符串。支持删除Unicode空白。接受一个可选的字符字符串来替换默认值。

s('  fòôbàř  ')->trimRight(); // '  fòôbàř'
truncate(int $length [, string $substring = '' ])

截断字符串到指定的长度。如果提供了$substring,并且发生了截断,则字符串将被进一步截断,以便子字符串可以附加而不超过所需的长度。

s('What are your plans today?')->truncate(19, '...'); // 'What are your pl...'
underscored()

返回由下划线分隔的、小写且修剪过的字符串。在字符串的每个大写字母之前(除了字符串的第一个字符)插入下划线,并用下划线替换空格和破折号。

s('TestUCase')->underscored(); // 'test_u_case'
upperCamelize()

返回一个UpperCamelCase版本的提供的字符串。它修剪周围的空格,将数字、空格、破折号和下划线之后的字母大写,并删除空格、破折号和下划线。

s('Upper Camel-Case')->upperCamelize(); // 'UpperCamelCase'
upperCaseFirst()

将提供的字符串的第一个字符转换为大写。

s('σ foo')->upperCaseFirst(); // 'Σ foo'

扩展

以下是一个扩展Stringy的库列表

测试

从项目目录中,可以使用 phpunit 运行测试

许可证

在MIT许可证下发布 - 详细信息请参阅 LICENSE.txt