2011-01-24 13 views
7

Chcę policzyć słowa w określonym ciągu, więc mogę go zweryfikować i uniemożliwić użytkownikom zapisanie na przykład więcej niż 100 słów.jak policzyć słowa w określonym ciągu w PHP?

Napisałem tę funkcję, ale nie sądzę, że jest wystarczająco skuteczna, użyłem funkcji eksplodującej z spacją jako ogranicznikiem, ale co jeśli użytkownik wstawi dwa spacje zamiast jednego. czy możesz dać mi lepszy sposób na zrobienie tego?

function isValidLength($text , $length){ 

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

brzmi jak „ile słów w pliku tekstowym” zadanie domowe dla mnie;) –

+0

myślę, że to jest rozwiązanie dla swojego problemu: http://www.reconn.us/count_words.html –

+0

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

Odpowiedz

17

Może str_word_count może pomóc

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

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

Tylko jeden z wymienionych wspomniał o 'str_word_count'. Czy to nie jest właściwe? –

+14

str_word_count jest ZŁY! Liczy się "wiele razy", jeśli jest zawarty w większych słowach, takich jak "motyw", "teoria" itp. Str_word_count jest do bani i widzę to wszystko na stackoverflow – giorgio79

+5

@ giorgio79 A co z oferowaniem alternatywy, a nie rantowania jak szaleniec. –

2

Użyj preg_split() zamiast eksplodować(). Split obsługuje wyrażenia regularne.

4

Funkcja ta wykorzystuje prosty regex podzielić wejście $ tekst na dowolny znak zakaz literę:

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

Gwarantuje to, że jest działa poprawnie ze słowami oddzielonymi wieloma spacjami lub dowolnymi innymi znakami innymi niż litery. Obsługuje również poprawnie znaki Unicode (np. Litery akcentowane).

Funkcja zwraca wartość true, gdy liczba słów jest mniejsza niż $ length.

10

Możesz użyć wbudowanej funkcji PHP str_word_count. Używaj go tak:

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

Będzie to wyjście 5.

Jeśli planujesz używać znaków specjalnych w żadnym z twoich słów, można dostarczać żadnych dodatkowych znaków jako trzeci parametr.

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

Będzie to wyjście 6.

+2

Dlaczego PHP musi używać tylu funkcji ...? – Blender

+0

@Blender Nie śledzę. –

+3

@Blender: PHP jest po prostu niesamowite. Wszystko, co chcesz, znajduje się w standardowej bibliotece. Właśnie ta mała funkcja 'makeBlog()' nadal nie istnieje. – NikiC

1

Korzystanie substr_count policzyć wszelkich wystąpień podciągu. aby znaleźć liczbę słów, ustaw $ needle na "". int substr_count (string $ stogu siana, string $ igła)

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


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

Jest kilka problemów z tym. Zlicza spacje, a nie słowa. Więc jeśli jest jedno słowo, to zwróci 0. Zlicza wiele spacji jako słowa (np. Jeśli umieścisz dwie spacje po każdym okresie, jak to często się dzieje). – orrd

4

str_count_words ma swoje wady. policzy podkreślenia jako oddzielone słowa, takie jak this_is dwa słowa:

Możesz użyć następnej funkcji do zliczania słów oddzielonych spacjami, nawet jeśli między nimi jest więcej.

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

Spróbuj:

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); 

Wyjście będzie: 5

+3

Jest to obecnie najlepsza odpowiedź, która jest zarówno zwięzła, jak i nie ma poważnych problemów.Ale uprościłbym treść funkcji jako po prostu 'return count (explode ('', preg_replace ('/ \ s + /', '', trim ($ string))));). – orrd

0

Istnieje N-1 odstępów między n przedmiotów więc nie będzie 99 przestrzenie pomiędzy 100 słów, więc u może wybierz i średnią długość słowa powiedz np. 10 znaków, następnie pomnóż przez 100 (dla 100 słów), następnie dodaj 99 (spacje), a następnie możesz ograniczyć limit na podstawie liczby znaków (1099).

function isValidLength($text){ 

if (strlen ($ text)> 1099)

 return false; 

inny return true;

}

0

napisałem funkcję, która jest lepsza niż str_word_count ponieważ funkcja PHP liczy kreski i inne znaki, jak słowa.

Również moja funkcja rozwiązuje problem podwójnych spacji, których wiele funkcji napisanych przez inne osoby nie bierze pod uwagę.

Ta funkcja obsługuje również znaczniki HTML. Gdzie, jeśli masz dwa znaczniki zagnieżdżone razem i po prostu użyjesz funkcji strip_tags, zostanie to policzone jako jedno słowo, gdy jest dwa. Na przykład: <h1>Title</h1>Text lub <h1>Title</h1><p>Text</p>

Dodatkowo, usuwam JavaScript pierwszy inny mądry kod w ramach <script> znaczniki będą liczone jako słowa.

Na koniec moja funkcja obsługuje spacje na początku i końcu łańcucha, wiele spacji i podziałów linii, znaków powrotu i znaków tabulacji.

############### 
# 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; 
} 
Powiązane problemy