Некоторое время в ближайшем будущем, я должен буду реализовать межъязыковой подсчет слов, или если это не возможно, межъязыковой счетчик символов.
Подсчетом слов я имею в виду точное количество слов, содержавших в рамках данного текста, беря язык текста. Язык текста установлен пользователем и, как будет предполагаться, будет корректен.
Счетчиком символов я имею в виду количество "возможно, одним словом", символов, содержавших в рамках данного текста с той же информацией о языке, описанной выше.
Я очень предпочел бы бывшее количество, но я знаю о включенных трудностях. Я также знаю, что последнее количество намного легче, но очень предпочтите первого, если вообще возможный.
Я любил бы его, если я просто должен был посмотреть на английский язык, но я должен рассмотреть каждый язык здесь, китайский язык, корейский, английский, арабский, хинди, и так далее.
Я хотел бы знать, имеет ли Переполнение стека, любой вовлекает, где начать искать существующий продукт / метод, чтобы сделать это в PHP, поскольку я - хороший ленивый программист*
Простой тест, показывающий, как str_word_count с set_locale не работает, и функция от str_word_count страницы php.net.
Подсчет символов прост:
echo strlen('一个有十的字符的句子'); // 30 (WRONG!)
echo strlen(utf8_decode('一个有十的字符的句子')); // 10
Подсчет слов - это то место, где все начинает усложняться, особенно для китайского, японского и других языков, в которых не используются пробелы (или другие распространенные символы «границы слова») в качестве разделителей слов. Я не говорю по-китайски и не понимаю, как работает подсчет слов на китайском, так что вам придется меня немного просветить - что делает слово в этих языках? Это какой-то конкретный символ или набор символов? Я помню, как читал что-то, связанное с тем, как трудно было идентифицировать японские слова в письме T9, но больше не могу это найти.
Следующее должно правильно возвращать количество слов в языках, которые используют пробелы или знаки препинания в качестве разделителей слов:
count(preg_split('~[\p{Z}\p{P}]+~u', $string, null, PREG_SPLIT_NO_EMPTY));
Ну, попробуйте:
<?
function count_words($str){
$words = 0;
$str = eregi_replace(" +", " ", $str);
$array = explode(" ", $str);
for($i=0;$i < count($array);$i++)
{
if (eregi("[0-9A-Za-zÀ-ÖØ-öø-ÿ]", $array[$i]))
$words++;
}
return $words;
}
echo count_words('This is the second one , it will count wrong as well" , it will count 12 instead of 11 because the comma is counted too.');
?>