Делаю я сайт для хранения текстов одного автора, аналогичный тому, что делала для себя. И решила я определить размер текста не в количестве знаков (которое, на мой взгляд, еще и считается с ошибкой). а в количестве слов. Так принято в тех кругах, где вращаюсь я и мой заказчик.
Как выяснилось, подсчитать количество слов на php – не такая уж простая задача. В php есть функция str_word_count, которая подсчитывает количество слов в строке, но она не работает с кириллицей. Все символы кириллицы она не считает за буквы и игнорирует.
Если что-то непонятно – надо спросить у гугла. Спросила. На одном из программистских форумов предложили решение – count(explode(‘ ‘,$text)). Прекрасно, подумала я! Забила эту строку в определение размера, а потом сравнила с результатом, который мне дает word. Второе число оказалось больше.
Чувствуя себя изобретателем велосипеда и проклиная Кирилла и Мефодия я перебрала несколько вариантов костылей и в итоге написала следующий код.
[php]
function countWords($text) {
// сразу удаляем переводы строк
$text1 = preg_replace(“/[\r\n]+/”, ” “, $text);
// символы, которые не являются словами и считать их не надо
// запятая и точка включены на случай невнимательного автора
$symbols = array(“—”, “-“, “\n”, “,”, “.”);
// разбиваем текст на слова
$arr = explode(‘ ‘,$text1);
// число полученных фрагментов
$nwords = count($arr);
// счетчик знаков препинания
$n = 0;
for($i = 0; $i<$nwords; $i++) {
// берем очередной фрагмент и смотрим его длину
$s = $arr[$i];
$l = mb_strlen($s,’UTF-8’);
if ($l == 1) {
// если это знак препинания, увеличиваем счетчик
if (in_array($s, $symbols)) $n++;
}
// мало ли, фрагмент с нулевой длиной, его тоже за слово не считаем
if ($l == 0) $n++;
}
// вычитаем лишние знаки
$nwords = $nwords – $n;
return $nwords;
}
[/php]
Количество слов совпало с тем, что показывает Word, при условии, что все тире являются длинными тире. Если в качестве тире использовать дефис, word считает его за отдельное слово, а если длинное тире — то не считает.