-1

我有一句话:

$text = "word word, dr. word: a.sh. word ak word?!..";

特殊词是:“博士”。、“a.sh”和“ak”

这个 :

$text = "word word, dr. word: a.sh. word ak word?!..";
$split = preg_split("/[^\w] ([\s]+[^\w] |$)/", $text, -1, PREG_SPLIT_NO_EMPTY);
print_r($split);

正则表达式给了我这个:

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

我需要

数组 (
[0] => word
[1] => word
[2] => dr. #<----- 点必须在这里,因为“dr.”是特殊词 [3] => word
[4] = > a.sh. #<----- 点必须在这里,因为“a.sh”是特殊词 [5] => 词
[6] => ak
[7] => 词)

4

1 回答 1

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 特殊字符(如.?),包括我们稍后将使用的分隔符。这样,您可以定义任何您喜欢的词,而不必担心它会如何影响正则表达式。

正则表达式。

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

一探究竟。

于 2013-08-08T20:24:51.807 回答