Autor Zpráva
SpotRudloff
Profil
Zdravím, dělám kód, který spočítá počet slov, každé jen jednou.

Mám tento kód:

for($i = strlen(trim($clanek)); $i >= 0; $i--) {
  preg_match("/\s*(\w*)\s*/i", $clanek, $match);
  
  if(count($match) > 0) {
    $slova .= $match[1]."\n";
  }
}


Jak docílit v regulárním výrazu, aby vynechal již nalezené slovo? Pokusil jsem se udělat kopii proměnné, ve které by to hledalo a potom se to z ní smazalo, jenže to nevyšlo. Pokud někdo víte, tak prosím o pomoc!
AM_
Profil
no nejefektivnější z hlediska rychlosti by bylo procházet text sekvenčně a počítat slova (bez použití regulárních výrazů), jinak to můžeš dělat tak, že preg_match slovo najdeš, preg_replace ho odstraníš a zároveň spočítáš jeho výskyty.
SpotRudloff
Profil
Přesně to jsem zkoušel, ale potom to právě našlo jen jedno slovo a konec. Zkusím to ještě jednou.
Text je uložen v heredocu, ale to na tom nic nemění.

EDIT: Výsledek opět stejný.
Keeehi
Profil
Nevím, jak je to s rychlostí a náročností na paměť, ale mělo by to být funkční řešení.
$slova = explode(" ",$vstup);
$unikatni_slova =  array_unique($slova);
echo "Počet slov: ".count($unikatni_slova);

Pokud potřebujete dělit nejenom podle mezer, ale třeba i podle nových řádků, můžete využít preg_split();
Majkl578
Profil
Pár možností jak na to:
$string = 'foo bar baz foo';

//1. možnost
var_dump(count(array_unique(str_word_count($string, 1))));

//2. možnost
var_dump(count(array_unique(preg_split('~\s+~', $string))));

//3. možnost
preg_match_all('~\S+~', $string, $matches);
var_dump(count(array_unique($matches[0])));
SpotRudloff
Profil
Díky, všechny fungují.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0