【问题标题】:PHP split UTF8 text into words and punctuationPHP 将 UTF8 文本拆分为单词和标点符号
【发布时间】:2012-06-15 09:47:32
【问题描述】:

我需要这样的 utf-8 文本:

“Bára, ta která má hezké oči. To je, ale nepříčetně nehorázné!”

拆分成单词和标点的数组,像这样:

Array (
    [0] => Bára
    [1] => ,
    [2] => ta
    [3] => která
    [4] => má
    [5] => hezké
    [6] => oči
    [7] => .
    [8] => To
    [9] => je
    [10] => ,
    [11] => ale
    ...
)

我在这里尝试了一些示例,但都不适用于 utf8 文本(á 或 ě 上的拆分文本)。

【问题讨论】:

  • 请贴出你试过的代码。
  • 我试过这个,但它不保留标点符号,并且在某些字符(š,ě)preg_split('/((^\p{P}+)|(\p{P}*\s+\p{P}*)|(\p{P}+$))/', $text, -1, PREG_SPLIT_NO_EMPTY) 和这个:http://stackoverflow.com/questions/1600649/split-text-into-words-problem-php-complicated-problem

标签: php regex utf-8 preg-split


【解决方案1】:

这个怎么样:

$string   = 'Bára, ta která má hezké oči. To je, ale nepříčetně nehorázné!';
$rawSplit = preg_split('/\b/u', $string, 0, PREG_SPLIT_NO_EMPTY);
$result   = array_filter( array_map( function($el) { 
  return trim($el); 
}, $rawSplit));

【讨论】:

    【解决方案2】:

    取自php.net comment(稍作修改):

    function mb_str_split( $string ) {
      $split = preg_split('/\b([\(\).,\-\',:!\?;"\{\}\[\]„“»«‘\r\n]*)/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
      return array_filter($split, 'filter');
    }
    
    function filter($val) {
      if (trim($val) != '') {
        return trim($val);
      }
      return false;
    }
    

    测试:

    print_r(mb_str_split("Bára, ta která má hezké oči. To je, ale nepříčetně nehorázné!"));
    
    /*
    Array
    (
        [0] => Bára
        [1] => ,
        [3] => ta
        [5] => která
        [7] => má
        [9] => hezké
        [11] => oči
        [12] => .
        [14] => To
        [16] => je
        [17] => ,
        [19] => ale
        [21] => nepříčetně
        [23] => nehorázné
        [24] => !
    )
    */
    

    【讨论】:

    • 不应该!符号分开?
    • 谢谢,但我需要拆分所有标点符号:
    • 即使是这样的字符:"(", ")", ".", "-", "\"", "'", ":", "!", "?", ";", ",", "{", "}", "[", "]", " „", "“", "»", "«", "‚", "‘"," ","\r", "\n"
    • 我已经更新了我的答案,你所有的迹象和灵感来自raina77ows 对\b 的精彩使用:) 我希望它现在适用于所有这些字符
    • 再次感谢,但恐怕您的代码的第 3 行会引发错误。
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2010-09-26
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    相关资源
    最近更新 更多