Я хотел бы разделить текст на отдельные слова, используя 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);