2011-01-24 2 views
7

Я хочу подсчитать слова в определенной строке, поэтому я могу проверить ее и запретить пользователям писать более 100 слов, например.как подсчитать слова в определенной строке в PHP?

Я написал эту функцию, но я не думаю, что она достаточно эффективна, я использовал функцию разрыва с пространством в качестве разделителя, но что, если пользователь ставит два пробела вместо одного. Можете ли вы дать мне лучший способ сделать это?

function isValidLength($text , $length){ 

    $text = explode(" " , $text); 
    if(count($text) > $length) 
      return false; 
    else 
      return true; 
} 
+0

звучит как «сколько слов в текстовом файле» проблемы в выполнении домашних заданий для меня;) –

+0

Я думаю, что это решение для вашей проблемы: http://www.reconn.us/count_words.html –

+0

HTTP : //stackoverflow.com/questions/21652261/using-str-word-count-for-utf8-texts – trante

ответ

17

Может str_word_count может помочь

http://php.net/manual/en/function.str-word-count.php

$Tag = 'My Name is Gaurav'; 
$word = str_word_count($Tags); 
echo $word; 
+0

Только один из них упомянул 'str_word_count'. Разве это не уместно? –

+14

str_word_count ПЛОХО! Он считается «многократным», если он содержится в более крупных словах, таких как «тема» «теория» и т. Д. Str_word_count сосет, и я все это вижу на stackoverflow – giorgio79

+5

@ giorgio79. Что относительно того, чтобы предлагать альтернативу, а не разглагольствовать, как сумасшедший. –

2

Используйте preg_split() вместо explode(). Split поддерживает регулярные выражения.

4

Эта функция использует простой регулярное выражение для разделения входного $ текста на любой не буквы характера:

function isValidLength($text, $length) { 
    $words = preg_split('#\PL+#u', $text, -1, PREG_SPLIT_NO_EMPTY); 
    return count($words) <= $length; 
} 

Это гарантирует, что является правильно работает со словами, разделенными несколькими пробелами или любым другим небуквенным символом. Он также правильно обрабатывает unicode (например, акцентированные буквы).

Функция возвращает true, когда количество слов меньше длины $.

10

Вы можете использовать встроенную функцию PHP str_word_count. Используйте его так:

$str = "This is my simple string."; 
echo str_word_count($str); 

Это выведет 5.

Если вы планируете использовать специальные символы в любом из ваших слов, вы можете указать любые дополнительные символы в качестве третьего параметра.

$str = "This weather is like el ninã."; 
echo str_word_count($str, 0, 'àáã'); 

Это выведет 6.

+2

Почему PHP нужно использовать так много функций ...? – Blender

+0

@Blender Я не следую. –

+3

@Blender: PHP просто потрясающий. Все, что вам нужно, находится в стандартной библиотеке. Просто эта небольшая функция 'makeBlog()' все еще отсутствует. – NikiC

1

Использование substr_count для подсчета числа любых вхождений подстроки. для нахождения количества слов, заданных $ needle, равным ''. INT substr_count (строка $ стог, строка $ игла)

$text = 'This is a test'; 
echo substr_count($text, 'is'); // 2 


echo substr_count($text, ' ');// return number of occurance of words 
+0

Есть несколько проблем с этим. Он подсчитывает пробелы, а не слова. Поэтому, если есть одно слово, оно вернет 0. И он считает несколько пробелов в виде слов (например, если вы помещаете два пробела после каждого периода, как это часто делается). – orrd

4

str_count_words имеет свои недостатки. он будет считать символы подчеркивания разделенными словами, такими как this_ru два слова:

Вы можете использовать следующую функцию для подсчета слов, разделенных пробелами, даже если между ними существует более одного.

function count_words($str){ 

    while (substr_count($str, " ")>0){ 
     $str = str_replace(" ", " ", $str); 
    } 
    return substr_count($str, " ")+1; 
} 


$str = "This is a sample_test"; 

echo $str; 
echo count_words($str); 
//This will return 4 words; 
6

Попробуйте это:

function get_num_of_words($string) { 
    $string = preg_replace('/\s+/', ' ', trim($string)); 
    $words = explode(" ", $string); 
    return count($words); 
} 

$str = "Lorem ipsum dolor sit amet"; 
echo get_num_of_words($str); 

Этот выход будет: 5

+3

Это на самом деле лучший ответ до сих пор, который является кратким и не имеет серьезных проблем.Но я бы упростил тело функции как просто 'return count (explode ('', preg_replace ('/ \ s + /', '', trim ($ string))));'. – orrd

0

Есть п-1 пространства между п объектов, так что будет 99 Промежутки между 100 слов, так вы можете выберите и среднюю длину слова, например, 10 символов, затем умножьте на 100 (на 100 слов), затем добавьте 99 (пробелы), тогда вы можете вместо этого ограничить количество символов (1099).

function isValidLength($text){ 

если (STRLEN ($ текст)> 1099)

 return false; 

еще возвращение правда;

}

0

Я написал функцию, которая лучше, чем str_word_count, потому что функция PHP подсчитывает тир и другие символы, как слова.

Также моя функция решает проблему двойных пространств, которые многие из функций, написанных другими людьми, не учитываются.

Также эта функция обрабатывает теги HTML. Если бы у вас было две метки, вложенные вместе, и просто использовала функцию strip_tags, это считалось бы одним словом, когда это два. Например: <h1>Title</h1>Text или <h1>Title</h1><p>Text</p>

Кроме того, я исключаю JavaScript, сначала другой мудрый код в тегах <script> будет считаться как слова.

Наконец, моя функция обрабатывает пробелы в начале и конце строки, нескольких пробелов и разрывов строк, символов возврата и символов табуляции.

############### 
# Count Words # 
############### 
function count_words($str) 
{ 
$str = preg_replace("/[^A-Za-z0-9 ]/","",strip_tags(str_replace('<',' <',str_replace('>','> ',str_replace(array("\n","\r","\t"),' ',preg_replace('~<\s*\bscript\b[^>]*>(.*?)<\s*\/\s*script\s*>~is','',$str)))))); 
while(substr_count($str,' ')>0) 
{ 
    $str = str_replace(' ',' ',$str); 
} 
return substr_count(trim($str,' '),' ')+1; 
}