我需要提取文本中的单词和短语。例如,文本为:
Hello World,"日本和中国",美国人,亚洲人,"犹太人和基督徒",以及半天主教徒,耶和华见证人
使用preg_split(),它应该返回以下内容:
- 你好
- 世界
- 日本和中国
- 美国人
- 亚洲人
- 犹太人和基督徒
- 以及
- 半天主教徒
- 约瓦氏
- 证人
我需要了解RegEx才能工作(或者可能吗?)。注意规则,短语用引号(")括起来。字母数字、单引号(')和短划线(-)被视为单词的一部分(这就是为什么"热瓦"one_answers"半天主教"被视为一个单词),其余用空格分隔的被视为单个单词,而其他未提及的符号则被忽略
实际上,使用str_getcsv可以非常简单地做到这一点,如下所示:
// replace any comma or space by a singe space
$str = preg_replace('/(,+[ ]+)|([ ]+)/', ' ', $str);
// treat the input as CSV, the delimiters being spaces and enclusures double quotes
print_r(str_getcsv($str, ' ', '"'));
输出:
Array
(
[0] => Hello
[1] => World
[2] => Japan and China
[3] => Americans
[4] => Asians
[5] => Jews and Christians
[6] => and
[7] => semi-catholics
[8] => Jehovah's
[9] => witnesses
)
如果您的示例字符串是典型的,请从处理单引号和双引号开始。我在这里使用了heredoc语法,以确保字符串可以安全使用。
$string = <<<TEST
Hello World, "Japan and China", Americans, Asians, "Jews and Christians", and semi-catholics, Jehovah's witnesses
TEST;
$safe_string = addslashes($string);//make the string safe to work with
$pieces = explode(",",$safe_string);//break into pieces on comma
$words_and_phrases = array();//initiate new array
foreach($pieces as $piece)://begin working with the pieces
$piece = trim($piece);//a little clean up
if(strpos($piece,'"'))://this is a phrase
$words_and_phrases[] = str_replace('"','',stripslashes($piece));
else://else, these are words
$words = explode(" ",stripslashes($piece));
$words_and_phrases = array_merge($words_and_phrases, $words);
endif;
endforeach;
print_r($words_and_phrases);
注意:您也可以使用preg_replace,但对于这样的东西,这似乎有些过头了。