Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja liczaca ilość słow
Forum PHP.pl > Forum > Przedszkole
kozyk
Drodzy uzytownicy forum prosze o pomoc.Szukam funkcji która obliczy mi ilość słów w polu tekstowym.Oto strona na której chciałbym ta funkcje napisać, miała by ona po nacisnieciu przycisku obliczyc ilość słow.

<?php

$tresc = (string)$_GET['tresc'];


?>
<html>
<head>
<title>Pole tekstowe</title>
</head>
<body>

<body bgcolor="black">
<br><br>
<center>
<form action="" method="get">
<textarea name="tresc" input type="text"></textarea>
<br><br>
<input type="submit" name="submit" value="oblicz ilosc wyrazów" />




</center>
</body>
</html>

Z góry dziekuje.Przepraszam za brak BBcodu ale jestem dopiero poczatkujacy w fdziedzinie programowania komputerowego
wujek2009
http://php.net/manual/en/function.strlen.php sprawdź funkcje strlen (np. var_dump(strlen($_POST['tresc']));

PS. $_GETem treść przekazujesz? nie lepiej $_POST?
Mefiuu
Hmmm... ale czy czasem funkcja strlen nie zwraca długości ciągu? A jemu chyba chodzi o zliczanie słów w tekście czy ja źle rozumiem?

bbcode dodajesz przez dodanie przed swoim kodem [php ] i po kodzie [/ php] oczywiście bez spacji winksmiley.jpg
kozyk
Tak, chodzi mi zliczanie ilości wyrazów (słów)
flashdev
Cytat(kozyk @ 8.08.2010, 15:02:34 ) *
Tak, chodzi mi zliczanie ilości wyrazów (słów)


Najprostszym przybliżonym sposobem to policzenie ilości *spacji i dodanie 1 do wyniku. W przybliżeniu powinno się zgadzać z ilością słow.

Edit
*spacji lub ogólnie białych znaków
Fifi209
Cytat(wujek2009 @ 8.08.2010, 13:55:50 ) *
http://php.net/manual/en/function.strlen.php sprawdź funkcje strlen (np. var_dump(strlen($_POST['tresc']));

Yyy?

@topic
Policzenie słów to wcale nie takie proste zadanie, musiałbyś mieć najlepiej jakiś słownik...

ew. rozbić po spacjach, przelecieć pętlą a w niej sprawdzać długość i pierwszy znak:
+/- coś takiego
  1. <?php
  2.  
  3. header('Content-Type: text/html; charset=utf8');
  4.  
  5. $tekst = 'Moja mama lubi koty, a tata nie. :)';
  6.  
  7. $text = explode(' ', $tekst);
  8. $words = array();
  9. $len = 0;
  10.  
  11. foreach ($text as $str) {
  12. $word = preg_replace('#[^a-ząśżźćęłóń]+#i', '' ,$str);
  13. if (mb_strlen($word) > 0) {
  14. $words[] = $word;
  15. $len += mb_strlen($word);
  16. }
  17. }
  18.  
  19. echo 'Słowa to: '.implode(', ', $words).'<br/>o łącznej długości: '.$len.' znaków.';
  20.  
  21. ?>


kozyk
Tylko czasem jak ktoś szybko pisze może zorbic wiecej spacji np " acha to jest Ala" > wtedy wyjdzie mi ze jest 6 wyrazów a jest 4
Fifi209
Cytat(kozyk @ 8.08.2010, 14:10:38 ) *
Tylko czasem jak ktoś szybko pisze może zorbic wiecej spacji np " acha to jest Ala" > wtedy wyjdzie mi ze jest 6 wyrazów a jest 4

Widać oglądałeś moje rozwiązanie...
flashdev
Cytat(kozyk @ 8.08.2010, 15:10:38 ) *
Tylko czasem jak ktoś szybko pisze może zorbic wiecej spacji np " acha to jest Ala" > wtedy wyjdzie mi ze jest 6 wyrazów a jest 4


Nie zawsze najważniejsza jest taka dokładność. Zadaj sobie pytanie czy w tym przypadku jest?
Jeśli ktoś niedbale pisze i wstawia po kilka spacji lub nie używa spacji po przecinku/kropce, to niech liczy się z tym, że wynik funkcji nie będzie prawidłowy.
Jeśli przepuszczasz przez funkcję jakieś komentarze czy coś podobnego to jak ktoś będzie chciał na złość śmieci przemycić to i tak to zrobi. A jak moderujesz wpisy to i tak nie dopuścisz do pojawienia się śmieci.
Armstrong
  1. $text= "ala dfashfa dhofgso sdjd";
  2. $words = count($words);
  3. echo $words;


aby uwzgledniało liczby:

  1. $words = (array_count_values(str_word_count(strtolower($text),1,'1234567890')));
IceManSpy
Jeśli chodzi o spacje na początku i końcu stringu, to ltrim i ptrim. Ponadto możesz sprawdzać czy znaki są między a-z i A-Z oraz czy chcesz liczby.
Fifi209
Cytat(IceManSpy @ 8.08.2010, 14:21:33 ) *
Jeśli chodzi o spacje na początku i końcu stringu, to ltrim i ptrim. Ponadto możesz sprawdzać czy znaki są między a-z i A-Z oraz czy chcesz liczby.

Albo trim dla jednego i drugiego...

@topic
Ludzie... dałem mu gotowca, który usuwa zbędne znaki i liczy słowa... + ilość znaków...
kozyk
Armstrong dzieki za pomoc normalnie piwo Ci wisze biggrin.gif
thek
To ja nieco rozwinę post fifiego, który moim zdaniem jest najbliżej prawidłowych rezultatów. Najpierw wszystkie znaki przestankowe zamieniamy na spacje, gdyż de facto oddzielają wyrazy. Do tego wora wrzucamy ,.?/;-!|\#_ a po takiej zamianie robimy jeszcze wyrażenie regularne, które akceptuje jedynie litery i spacje. No chyba, że decydujemy się by każda liczba też była uznawana za wyraz. Wtedy musimy jako zamienianie na spacje rozszerzyć o znaki działań w poprzednim kroku. Ciekawostką jaką być może wiele osób nie zna jest fakt ujmowania w regexp polskich znaków poprzez coś innego niż [a-ząćęłńóśżź], a jest to możliwe poprzez użycie znacznie krótszego zapisu [a-ż] smile.gif Na koniec trim i zamiana wielokrotnie występujących obok siebie spacji na pojedynczą. Teraz już możemy faktycznie policzyć ile mamy wyrazów. Metod też jest kilka. Albo zsumowanie spacji, albo podział stringa do tablicy poprzez explode po spacji i zrobienie count. Możliwości jest naprawdę więcej niż 1 winksmiley.jpg
flashdev
Cytat(thek @ 8.08.2010, 16:21:56 ) *
[...]
Ciekawostką jaką być może wiele osób nie zna jest fakt ujmowania w regexp polskich znaków poprzez coś innego niż [a-ząćęłńóśżź], a jest to możliwe poprzez użycie znacznie krótszego zapisu [a-ż] smile.gif
[...]


Warto podkreślić to zdanie, sam nie wiedziałem a teraz widzę jak mogłem uprościć niejedną linijkę kodu.
damyrade1990
  1. <?php
  2.  
  3. $str="Jakiś bardzo długi tekst ";
  4.  
  5. preg_match_all("#[ ]{1}#sie",trim($str), $str);
  6.  
  7. $str=(int)count($str[0])+1;
  8.  
  9. echo "Ilość słow to: ".$str;
  10.  
  11. ?>
thek
Bym nie dodał... Jeśli chodzi o zapytanie akceptujące jedynie litery i spację, to ma to być zastępowanie wszystkiego co nimi nie jest znakiem pustym lub spacją (i tak następny krok nam wszystkie nadmiarowe poskraca). Całość skryptu jest niewrażliwa na byki w stylu wielokrotnych spacji obok czy też zapominania spacji po znakach przestankowych. Większość skryptów tutaj rozpozna zdanie "Modrzew,mimo iż posiada jaskrawo-zielone igły,gubi je jesienią." jako 7 wyrazowe, co jest przekłamaniem z racji nie uwzględnienia myślnika oraz braku spacji po przecinkach. Przelećcie teraz algorytmem jaki podałem i zobaczcie, że owe znaki u mnie stają się spacjami. Co automatycznie koryguje wyniki smile.gif Jedyne na co jest niewrażliwy to zgubione spacje, czyli choćby "alamakota". No ale z punktu widzenia gramatyki jest to jeden wyraz winksmiley.jpg
Armstrong
@up
z moim rozwiązaniem pokazuje 10 wyrazów i nie trzeba wiele kombinować

ludzie skapujecie się, że podałem rozwiązanie?
muk4
str_word_count ?
Coś nie tak z tą funkcją, że jej nie chcecie użyć?
flashdev
Cytat(muk4 @ 8.08.2010, 18:23:59 ) *
str_word_count ?
Coś nie tak z tą funkcją, że jej nie chcecie użyć?


Jest cool i wogóle fajna.

Ale...
  1. echo str_word_count('Ala ma ślimaka.'); // 4
Wicepsik
Cytat(flashdev @ 8.08.2010, 20:08:41 ) *
Jest cool i wogóle fajna.

Ale...
  1. echo str_word_count('Ala ma ślimaka.'); // 4

Jak 4? U mnie wyświetla 3..
muk4
@flashdev
U mnie jest 3.

@EDIT

Wyprzedził tongue.gif
Fifi209
Cytat(Armstrong @ 8.08.2010, 17:10:43 ) *
@up
z moim rozwiązaniem pokazuje 10 wyrazów i nie trzeba wiele kombinować

ludzie skapujecie się, że podałem rozwiązanie?


Które źle działa.

Masz tutaj dwa porównane kody, MÓJ i TWÓJ:
  1. <?php
  2.  
  3. header('Content-Type: text/html; charset=utf8');
  4.  
  5. $tekst = 'Ala ma kota,ale ala o niego nie dba :(. kot jest bardzo,zaniedbany.przez alę... :( !!to bardzo straszne?hehe';
  6.  
  7. function countWords($string) {
  8. $string = preg_replace('#[\.\,\?!]+#', ' ', $string);
  9. $text = explode(' ', $string);
  10. $words = array();
  11. $len = 0;
  12.  
  13. foreach ($text as $str) {
  14. $word = preg_replace('#[^a-ż]+#i', '', $str);
  15. if (mb_strlen($word) > 0) {
  16. $words[] = $word;
  17. $len += mb_strlen($word);
  18. }
  19. }
  20.  
  21. return array('words' => $words, 'len' => $len);
  22. }
  23.  
  24. $fifi = countWords($tekst);
  25.  
  26. $Armstrong = (array_count_values(str_word_count(strtolower($tekst),1)));
  27.  
  28. echo 'Fifi: <br/><pre>';
  29. print_r($fifi);
  30. echo '</pre><br/>Armstrong:<br/><pre>';
  31. print_r($Armstrong);
  32.  
  33. echo '</pre><br/>Fifi ilość: '.count($fifi['words']).'<br/>Armstrong ilość: '.count($Armstrong);
  34.  
  35.  
  36. ?>
Armstrong
@fifi209 Kilkunastu linijek zrobiłem raptem 2, dlaczego pokazuje o 2 za mało można się domyślić z tego jak przedstawiłeś dane.

wystarczy wywalić:
  1. $Armstrong = (array_count_values(str_word_count(strtolower($tekst),1)));

a dać:
  1. $Armstrong = (str_word_count(strtolower($tekst),1));


i działa.

Fifi ilość: 19
Armstrong ilość: 19

Wcześniej zliczało także ile razy występowały te wyrazy.
thek
Muk4... problem z wszystkimi, powtarzam jeszcze raz wszystkimi bez wyjątku funkcjami str* jest ten, że źle działają z polskimi znakami. Można używać wersji mb_*, ale nie wszystkie funkcje str* mają swoje odpowiedniki pośród nich. Stąd właśnie problem ze "ślimakiem" Funkcja zliczająca wyrazy tratuje polskie diakrytyki jako znaki nieliterowe (kto nie wierzy niech sam sprawdzi) i w ten sposób słowo "kościół" może zostać uznane za 1, 2, albo nawet 3 wyrazy ( litery ś oraz ó zrobią za "spacje" ). Stąd im się nie ufa z założenia.

Warunkiem koniecznym jest odpowiednie potraktowanie wejścia by rozdzielić potencjalne wyrazy, a potem usunięcie tego, co nie jest spacją lub literą polskiego alfabetu.

Fifi... zapomniałeś jeszcze o myślniku, dwukropku, średniku i kilku ogólnie znakach interpunkcyjnych, które mogą oddzielać wyrazy w funkcji robiącej z nich spację. Poza tym niepotrzebnie od razu robisz explode. Wpierw wywal nieliterowe znaki, zredukuj wielokrotne space do tylko jednej, strimuj całość zdania i potem rób explode. Będzie jeszcze mniej wrażliwe na ewentualne byki.
flashdev
Cytat(Wicepsik @ 8.08.2010, 20:20:05 ) *
Jak 4? U mnie wyświetla 3..


Kurcze sprawdziłem jeszcze raz, no bo błąd się każdemu może zdarzyć no i dalej widzę 4.

Cytat
PHP Version 5.3.1

Za stare mam PHP?

Edit:
Ciekawe, w PHP 5.2.11 (http://ideone.com/hXxIr) też wychodzi 3
Armstrong
Ala ma ślimaka.
  1. $Armstrong = (str_word_count(strtolower($tekst),1,'ąśćżźłó'));


wyjdzie 3.

Po coś są te dodatkowe parametry. Raczej nie tworzono ich aby ładnie pisało.
thek
Armstrong... Ale jak zachowa się w przypadku bardziej złożonych zdań? Nie mówimy tu bowiem o jedynie prostych, ale także złożonych, z pominiętymi spacjami po znakach interpunkcyjnych i ogólnie błędną gramatyką. Wiem, że str_word_count jest fajne i jako wbudowana powinna być wydajniejsza. Tylko trzeba przetestować wydajność tę oraz faktyczną skuteczność.

A co do naszych funkcji to i tak będą jaja gdy ktoś zechce pisać w dialekcie leet czy pokemonami. Bo wtedy zamiast liter wchodzą też cyfry, a to w przypadku zdań z wyrażeniami matematycznym i wywoła chaos w wynikach. Nieważne którą wersję byśmy wykorzystali biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.