将句子分成单词(带有特殊单词列表)

时间:2013-08-08 19:43:50

标签: php regex text-segmentation

我有句话:

  

$ text =“word word,dr。word:a.sh. word a.k word?!..;

特别的话是:“博士”。 ,“a.sh”和“a.k”

这个:

  

$ text =“word word,dr。word:a.sh. word a.k word?!..”;   $ split = preg_split(“/ [^ \ w] ([\ s] + [^ \ w] | $)/”,$ text,-1,PREG_SPLIT_NO_EMPTY);
  的print_r($分割);

正则表达式给了我这个:

 Array (   
     [0] => word   
     [1] => word  
     [2] => dr  
     [3] => word    
     [4] => a.sh   
     [5] => word   
     [6] => a.k   
     [7] => word     ) 

我需要

  

阵列(
      [0] =>字
      [1] =>字
      [2] =>博士。 #< -----点必须在这里因为“博士”。是特殊的词       [3] =>字
      [4] =>灰。 #< -----点必须在这里因为“a.sh”是特殊字       [5] =>字
      [6] => A.K
      [7] =>字)

1 个答案:

答案 0 :(得分:0)

我认为你正在倒退。而不是试图定义一个非单词的正则表达式 - 定义什么是单词,并捕获与之匹配的所有字符序列。

$special_words = array("dr.", "a.sh.", "a.k");
array_walk($special_words, function(&$item, $key){ $item= preg_quote($item, '~');});

$regex = '~(?<!\w)(' . implode('|', $special_words) . '|\w+)(?!\w)~';
$str = 'word word, dr. word: a.sh. word a.k word?!..';
preg_match_all($regex, $str, $matches);
var_dump($matches[0]);

这里的键是一个特殊单词数组,array_walk和正则表达式。

array_walk

这一行,在你的数组定义之后,遍历每个特殊单词并转义所有REGEX特殊字符(如.?),包括我们要去的分隔符以后用。这样,您可以定义自己喜欢的任何单词,而不必担心它会如何影响正则表达式。

正则表达式。

正则表达式实际上非常简单。使用|作为粘合剂内爆特殊单词,然后添加另一个管道和标准单词定义(我选择了w+,因为它对我来说最有意义。)用括号围绕那个巨大的交替进行分组我添加了一个lookbehind和lookahead,以确保我们不会从一个单词的中间窃取。由于正则表达式从左向右工作,a中的a.sh.不会被分割为自己的单词,因为a.sh.特殊单词会捕获它。除非它说a.sh.e,在这种情况下,三部分表达式的每个部分将匹配为三个单独的单词。

Check it out.