Я хотел бы разделить текст на отдельные слова, используя PHP. Вы знаете, как это достичь?
Мой подход:
function tokenizer($text) { $text = trim(strtolower($text)); $punctuation = '/[^a-z0-9äöüß-]/'; $result = preg_split($punctuation, $text, -1, PREG_SPLIT_NO_EMPTY); for ($i = 0; $i < count($result); $i++) { $result[$i] = trim($result[$i]); } return $result; // contains the single words } $text = 'This is an example text, it contains commas and full-stops. Exclamation marks, too! Question marks? All punctuation marks you know.'; print_r(tokenizer($text)); Это хороший подход? У вас есть идеи для улучшения?
Заранее спасибо!
Используйте класс \ p {P}, который соответствует любому символу пунктуации unicode в сочетании с классом whspace \ s.
 $result = preg_split('/((^\p{P}+)|(\p{P}*\s+\p{P}*)|(\p{P}+$))/', $text, -1, PREG_SPLIT_NO_EMPTY); 
Это будет разделено на группу из одного или нескольких символов пробелов, но также сосать любые окружающие знаки пунктуации. Он также соответствует символам пунктуации в начале или конце строки. Это дискриминирует такие случаи, как «не надо» и «он сказал« ой! »»
Tokenize – strtok .
 <?php $text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.'; $delim = ' \n\t,.!?:;'; $tok = strtok($text, $delim); while ($tok !== false) { echo "Word=$tok<br />"; $tok = strtok($delim); } ?> 
  Сначала я должен сделать строку в нижнем регистре, прежде чем раскалывать ее.  Это сделало бы модификатор i и обработку массива впоследствии ненужными.  Кроме того, я бы использовал сокращение \W для символов, отличных от слов, и добавил множитель + . 
 $text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.'; $result = preg_split('/\W+/', strtolower($text), -1, PREG_SPLIT_NO_EMPTY); 
  Изменить Используйте свойства символа Юникода вместо \W как предлагалось marcog .  Что-то вроде [\p{P}\p{Z}] (знаки препинания и разделителя) будет охватывать символы, более специфичные, чем \W 
вы также можете использовать функцию PHP strtok () для извлечения строковых токенов из вашей большой строки. вы можете использовать его так:
  $result = array(); // your original string $text = 'This is an example text, it contains commas and full stops. Exclamation marks, too! Question marks? All punctuation marks you know.'; // you pass strtok() your string, and a delimiter to specify how tokens are separated. words are seperated by a space. $word = strtok($text,' '); while ( $word !== false ) { $result[] = $word; $word = strtok(' '); } 
подробнее о документации php для strtok ()
Делать:
 str_word_count($text, 1); 
Или, если вам нужна поддержка юникода:
 function str_word_count_Helper($string, $format = 0, $search = null) { $result = array(); $matches = array(); if (preg_match_all('~[\p{L}\p{Mn}\p{Pd}\'\x{2019}' . preg_quote($search, '~') . ']+~u', $string, $matches) > 0) { $result = $matches[0]; } if ($format == 0) { return count($result); } return $result; } 
Вы также можете использовать метод explode: http://php.net/manual/en/function.explode.php
 $words = explode(" ", $sentence);