Autor Zpráva
Michal5
Profil *
Ahojte, vedeli by ste mi pomoct s touto funkciou? Funkcia mi nejaky string ktory obsahuje nejaku vetu rozlozi na slova podla podmienky dlzky slova do pola, problem je ze s diakritikou ma problem a uz nad tym sedim par hodin a nedari sa mi zistit v com by mohol byt problem:

function extractCommonWords($string){
  
      $string = preg_replace('/\s\s+/i', '', $string);
      $string = trim($string);
      
      $string = strtolower($string);
   
      preg_match_all('/\b.*?\b/i', $string, $matchWords);
      $matchWords = $matchWords[0];
      
      foreach ( $matchWords as $key=>$item ) {
          if ( $item == '' || strlen($item) <= 3 ) {
              unset($matchWords[$key]);
          }
      }   
      $wordCountArr = array();
      if ( is_array($matchWords) ) {
          foreach ( $matchWords as $key => $val ) {
              $val = strtolower($val);
              if ( isset($wordCountArr[$val]) ) {
                  $wordCountArr[$val]++;
              } else {
                  $wordCountArr[$val] = 1;
              }
          }
      }
      arsort($wordCountArr);
      $wordCountArr = array_slice($wordCountArr, 0, 10);
      return $wordCountArr;
}



//zistil som ze pri kodovani win-1250 to funguje, takze zjavne asi musim v tej funkcii pracu s utf8? lebo ak si vypisem samotny string a mam nastavene spravne kodovanie, tak sa diakritika zobrazuje, rozhodi ju az ta funkcia
Keeehi
Profil
Nechce se mi studovat tvůj kód, ale z popisu jsem si na 99% jistý že vím, kde je problém.

UTF-8 na rozdíl od win-1250 je multibytové kódování. Pro kódování různých znaků používá různý počet bytů. Pro "c" je to jeden, pro "č" jsou to 2. V jednoduchosti vrací funkce strlen počet bytů, které zabírá řetězec v paměti a vůbec se nezabývá obsahem.

Řešení je jednoduché, používat funkce mb_* které jsou určené pro práci s řetězci v multibytovém kódování.

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: