[ CiM0beTa @ 09.08.2012. 19:29 ] @
Code (php):

// validacija description
function valid_description($description) {
     global $error;
     if (preg_match("/[^-a-z0-9šđč枊ĐČĆŽ.: _\/]/i", $description)) {
          $error[] = 'Opis može sadržati velika i mala slova srpske latinice i (brojeve . : _ - / prazna mesta).';   
     }
     if (strlen($description)<3 && strlen($description)>0) {
          $error[] = 'Opis mora sadržati više od 3 karaktera.';
     }
     if (strlen($description)>300) {
          $error[] = 'Previše karaktera.';
     }
}
 


uradio sam neku prostu validaciju za unos teksta , prazna mesta prolaze, kao i crtice, tačke, brojevi, kosa crta...ali kad u textarea kliknem enter za novi red, onda mi to ne prolazi validaciju.
E sad ja sam probao da iskljucim validaciju i da vidim šta će da zapiše , ali vidim i source strane ne sadrži nikakve karaktere, mislio sam da je to <br> ali nije, pogledao sam i bazu, samo stoje prazna polja, tj. redovi. O čemu se radi?
[ PHPovac @ 09.08.2012. 19:31 ] @
Uradi nl2br na stringu.
[ CiM0beTa @ 09.08.2012. 20:29 ] @
Code (php):

// validacija description
function valid_description($description) {
     global $error;
     $description = nl2br($description);
     if (preg_match("/[^-a-z0-9šđč枊ĐČĆŽ.: _\/]/i", $description)) {
          $error[] = 'Opis može sadržati velika i mala slova srpske latinice i (brojeve . : _ - / prazna mesta).';   
     }
     if (strlen($description)<3 && strlen($description)>0) {
          $error[] = 'Opis mora sadržati više od 3 karaktera.';
     }
     if (strlen($description)>300) {
          $error[] = 'Previše karaktera.';
     }
}
 


uradio sam ovo ali i dalje ne ispisuje ništa, tj, ne prolazi validaciju.
[ PHPovac @ 09.08.2012. 20:31 ] @
Pa ukloni validaciju ili ubaci < i > kao i / i ostale html tagove
[ CiM0beTa @ 09.08.2012. 20:36 ] @
ma ne zelim da mi ovaj tekst bude izvršan. evo probao sam i ima raznih varijanti, moze da se ubaci 300 <br> simbola i ode ceo dizajn. Jel moze na ovaj description da uradim samo htmlentities, pitam zato šro ima naših slova...ajde probaću.
[ PHPovac @ 09.08.2012. 20:42 ] @
nl2br pretvara nove redove u <br/> kao što piše u dokumentaciji. Što se tiče htmlentities, ja mislim da ti ne znaš čemu to služi..
[ CiM0beTa @ 09.08.2012. 20:54 ] @
videcu nl2br ako mi se bude uklopilo, moram malo da ga proucim,

inace sad sam uradio samo:

$_POST['description'] = htmlentities($_POST['description'], ENT_QUOTES, "UTF-8");
tako da sto napisem to i dobijem. mislim to mi više odgovara, za ovo polje

--------------

sad sam video pogresno sam upotrebio nl2br, na mestu gde ne treba..sad cu da proverim ponovo
[ pajaja @ 09.08.2012. 22:37 ] @
Citat:
ma ne zelim da mi ovaj tekst bude izvršan.

Ako uradis ono sto sam ti vec bio napisao u drugoj temi nece ti biti izvrseno. Ne znam zasto komplikujes i sam sebi pravis probleme umesto da uradis na jednostavan nacin.

Sto se tice velikog broja razmaka, mozes regularnim izrazom da zamenis vise uzastopnih novih linija sa samo jednom.
[ Milos911 @ 09.08.2012. 22:46 ] @
Za to cuvanje u bazi ne treba da radis nista osim html special chars, i mysql real escape string.
Za ispis na stranici koristis nl2br, a za edit u texarea ne koristis (novi redovi ce se sami pojaviti).

Prestani da trcis kao muva bez glave, i citaj objasnjenja funkcija i komentare ispod (da si radio to isto, znao bi da je napr koriscenje regular expressions-a u toj situaciji overkill)... Kad se vec trudis da naucis, potrudi se da razumes to sto radis, a ne da samo letimicno preletis preko problema i kazes "radi, naucio sam"...
[ CiM0beTa @ 10.08.2012. 09:20 ] @
kazem da sam pokusao nl2br za editovanje a ne za prikazivanje, nisam shvatio.
[ ivan.a @ 11.08.2012. 09:00 ] @
A zašto ne bi automatski uklonio prazne redove (npr. ukoliko ima više od 2)?

Jednostavan primer:
Code:
function custom_nl2br($str, $rep = "\n", $max = 2) {
$arr = explode($rep, $str);
$str = '';
$nls = 0;
    foreach($arr as $line) {
    $str .= $line;
    if (empty($line)) {
    $nls++;
    } else {
    $nls = 0;
           }
      if ($nls < $max) {
      $str .= $rep;
                       }
      }
return substr($str, 0, strlen($str) - strlen($rep));
}


Da bi shvatio kako funkcioniše prvo dobro pogledaj ovaj kod (mada je jednostavan).
Prvo se generiše niz ($arr) na osnovu praznih polja. U petlji se proverava da li postoji prazno polje. Ukoliko postoji brojač ($nls) se povećava za 1, u suprotnom se brojač resetuje na 0. Zatim se proverava da li je brojač veći od broja dozvoljenih praznih redova ($max) i ako nije stringu se dodaje taj red.

Korišćenje:
$text = custom_nl2br($text, "\n", 2);

prvi argument je string(tekst), drugi je znak za "razdvajanje" praznih polja (<br> ili <br /> ili \n), treći argument je ukupan broj dozovljenih praznih polja.
[ CiM0beTa @ 11.08.2012. 13:01 ] @
ovo je korisno. hvala :)
[ Goran Rakić @ 11.08.2012. 13:29 ] @
Ivane, ja bih to pre ovako rešio. Regularni izraz hvata od jednog do $max pojavljivanja preloma reda i zanemaruje ostale uzastopne. Na svakom uhvaćenom delu kroz callback prebacuje u <br />.

Code (php):

/**
 * Kao nl2br() ali zanemaruje više od $max uzastopnih preloma reda  
 */

function custom_nl2br($str, $max=2) {
   $needle = "(\r\n|\n\r|\n|\r)";
   $regexp = '/('.$needle.'{1,'.$max.'})'.$needle.'*/';
   return preg_replace_callback($regexp, function($match) {
      return nl2br($match[1]);
   }, $str);
}

// primer:
var_dump(custom_nl2br("Hello\nWorld\n\n\n\nSomething\n\nKeep."));
 


Kada bolje razmislim, bolje je prvo propustiti sve kroz nl2br(), a onda otkloniti duplirane <br />:
Code (php):

function custom_nl2br($str, $max=2) {
   $str = nl2br($str, true);
   $needle = '('.PHP_EOL.')';
   $regexp = '%('.$needle.'{1,'.$max.'})'.$needle.'*%';
   return preg_replace($regexp, '\1', $str);
}
 


Obe verzije za razliku od tvog primera gore rade i kada veb pregledač pošalje \r\n umesto \n kao oznaku preloma. nl2br() se isto tako ponaša. Trebalo bi i da je memorijski manje zahtevno jer ne prebacuje string u niz bez potrebe, mada bih rekao da je to već sitničarenje.

[Ovu poruku je menjao Goran Rakić dana 11.08.2012. u 16:20 GMT+1]