我有句话:
$ 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] =>字)
答案 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和正则表达式。
这一行,在你的数组定义之后,遍历每个特殊单词并转义所有REGEX特殊字符(如.
和?
),包括我们要去的分隔符以后用。这样,您可以定义自己喜欢的任何单词,而不必担心它会如何影响正则表达式。
正则表达式实际上非常简单。使用|
作为粘合剂内爆特殊单词,然后添加另一个管道和标准单词定义(我选择了w+
,因为它对我来说最有意义。)用括号围绕那个巨大的交替进行分组我添加了一个lookbehind和lookahead,以确保我们不会从一个单词的中间窃取。由于正则表达式从左向右工作,a
中的a.sh.
不会被分割为自己的单词,因为a.sh.
特殊单词会捕获它。除非它说a.sh.e
,在这种情况下,三部分表达式的每个部分将匹配为三个单独的单词。