如何在Php中将多字节字符串拆分为单词?

3
如何在Php中将多字节字符串拆分成单词?以下是我迄今为止所做的,但我希望改进代码...
   mb_internal_encoding( 'UTF-8');
   mb_regex_encoding( 'UTF-8');
   $arr = mb_split( '[\s\[\]().,;:-_]', $str );

有没有一种方式来表达一个单词是由“字母”字符序列组成的(不使用a-z符号表示,因为我想包括非拉丁字符)


你的字符串是什么样子的,使用了哪种字符集? - Dejan Marjanović
3个回答

8

试试这个:

preg_match_all('/[\p{L}\p{M}]+/u', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
    # Matched text = $result[0][$i];
}

匹配所有带重音符号的字母组成的单词:

     "
[\p{L}\p{M}]       # Match a single character present in the list below
                   # A character with the Unicode property “letter” (any kind of letter from any language)
                   # A character with the Unicode property “mark” (a character intended to be combined with another character (e.g. accents, umlauts, enclosing boxes, etc.))
   +               # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
"

See it.


如果单词中包含非拉丁字符,则会漏掉最后一个字母。句子“också här finns hö” => ocks,här,finns,h。 - ragnarius
@ragnarius 已修复。原因是单词边界与UTF-8不兼容 :) - FailedDev
太好了!但是 /u 是什么意思? - ragnarius
@ragnarius 当然不会,因为它期望一个空格或字符串的开头或结尾。所以你只想要来自任何语言的任何字母序列。最新更新 - 希望如此 :) - FailedDev
我不确定你指的是哪个链接?你的回答因某些原因被回滚了,但我认为现在的答案很好。 - ragnarius
显示剩余4条评论

0

许多语言不使用单词(中文)。在这种情况下,函数是否应该返回整个字符串?在PHP中,explode()是二进制安全的,因此如果您只需要一个分隔符,直接使用它可能会更快。


不,我需要很多分隔符,每个不是字母的字符都应该是一个分隔符。在1.0版本中不处理中文也可以。 - ragnarius

-1
也许你应该使用\w

这是一个答案吗?猜测?提示?问题? - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接