PHP: 如何从一个(多字节)字符串中提取所有预定义的子字符串?

PHP: How to extract from a (multibyte) string all predefined substrings?

我想将一个字符串(代表一个单词)拆分为字母和预定义的多字母序列。换句话说,我想以 "greedy" 方式和它们出现的顺序从字符串匹配中提取预定义的子字符串。

例如,如果我的子字符串数组包含所有拉丁字母和波兰语二合字母:['ch', 'cz', 'dz', 'dź', 'dż', 'rz', 'sz'] 那么 szczebrzeszyn 将被解析为 ['sz', 'cz', 'e', 'b', 'rz', 'e', 'sz', 'y', 'n'].

当然我可以写一些逐个字符比较的嵌套循环,但也许有一些创造性的和更有效的方法来使用内置的字符串函数来获得这样的结果?我怎样才能在 PHP 中以高效且多字节安全的方式执行此操作?

preg_match_all('/sz|cz|\X/u', 'wszczęcie', $matches);
print_r($matches);

returns:

Array
(
    [0] => Array
        (
            [0] => w
            [1] => sz
            [2] => cz
            [3] => ę
            [4] => c
            [5] => i
            [6] => e
        )
)

所以上面的代码似乎可以完成这项工作。重要的一点是:子字符串按照它们提供的顺序进行匹配,所以较长的应该先匹配('cz' 应该在 'c' 之前匹配,等等)。 u 标志对于使其多字节安全很重要。