Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Zdravím mám problém s regulárním výrazem.
Pokud chci zakázat určité znaky

$kontrola='#[^/$_]#';
       if(preg_match($kontrola,$jmeno)

Ale chybu to vypíše jen v případě, že jsou tam znaky samotné.
Pokud tedy zadám Franta_$ podmínka projde v pořádku.
Potřeboval bych vyřešit jak určité znaky zakázat absolutně.
A když už jsme u toho rada jaké znaky jsou nebezpečné a měli by se zakazovat by se mi hodila :D
Díky

 
Odpovědět  +1 27.8.2014 0:22
Avatar
Patrik Smělý (SogoCZE)
Tým ITnetwork
Avatar
Patrik Smělý (SogoCZE):

Ahoj, pokud chceš uklízet vstupy od uživatele, je asi nejlepší si na to udělat funkci. Něco jsem rychle sepsal.

        if(!get_magic_quotes_gpc())
        $message = addslashes($message);
        $message = strip_tags($message);
        $message = htmlentities($message);
  mysql_real_escape_string($message); - toto jen pokud používáš Mysql ovladač.
        return trim($message);
}

a pak to jednoduše použij

$text1 = clear($text);
Editováno 27.8.2014 0:31
Nahoru Odpovědět 27.8.2014 0:29
PHP můj oblíbený jazyk......
Avatar
Patrik Smělý (SogoCZE)
Tým ITnetwork
Avatar
Patrik Smělý (SogoCZE):
  function clear($message)
{
        if(!get_magic_quotes_gpc())
        $message = addslashes($message);
        $message = strip_tags($message);
        $message = htmlentities($message);
  mysql_real_escape_string($message);
        return trim($message);
}

takle je to celá funkce sorry.

Nahoru Odpovědět 27.8.2014 0:45
PHP můj oblíbený jazyk......
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Diky ale tohle ošetřené mám, jde o to že při vytvoření se mi z toho udělá URL adresa a ta je nefunkční pokud jsou tam některé znaky nevím přesně které ošetřuji to prvně.
Pokud mám například clanek.php?cla­nek=sda/_"asd$ nazev clanku ktery vklada uzivatel je sda/_"asd$ a v tomto případě se url načte chybně.
Tak mě napadlo znaky zakázat ale nevím jak.

 
Nahoru Odpovědět 27.8.2014 1:09
Avatar
Patrik Smělý (SogoCZE)
Tým ITnetwork
Avatar
Odpovídá na Maxy_obr
Patrik Smělý (SogoCZE):

Však to taky prožeň ten get clearem, a ty znaky zmizí.

Nahoru Odpovědět  +1 27.8.2014 1:31
PHP můj oblíbený jazyk......
Avatar
Maxy_obr
Člen
Avatar
Maxy_obr:

Jasně díky to mi nedošlo.

 
Nahoru Odpovědět  +1 27.8.2014 3:00
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Maxy_obr
Marek Z.:

Tohle by také mohlo fungovat:

<?php

$znaky = '\/_\$';
if(preg_match("~([$znaky])+~", $text) == 1){
    echo 'Obsahuje zakázané znaky.';
}

Jelikož $ má v reguláru funkci tak mu musíš vrátit původní význam tím '\' to samé si můžeš všimnout i u '/'.

Pokud tedy řetězec bude obsahovat /, _ či $ bude to chyba.

Editováno 27.8.2014 16:43
Nahoru Odpovědět 27.8.2014 16:41
Chybami se člověk učí, běžte se učit jinam!
Avatar
Bertram
Člen
Avatar
Odpovídá na Maxy_obr
Bertram:

Znak stříška nesmí být v tomto případě jako první, protože pak to znamená, že očekáváš pouze řetězec /$_

Možná úprava:

<?php
$jmeno = 'Franta_$';
$kontrola='#[/$_^]#';
if(preg_match($kontrola,$jmeno)){
        echo"Neplatný vstup";
}

V žádném případě ti nedoporučuji výše uvedenou funkci clear, to je etalon toho, jak se to nemá dělat.

Editováno 28.8.2014 13:55
 
Nahoru Odpovědět  -1 28.8.2014 13:53
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Bertram
Maxy_obr:

no co já vím

'#[a]#';

znamená musí obsahovat minimálně jeden uvedený znak tedy a

'#[^a]#';

-> nesmí obsahovat

'#^[a]#';

-> musí začínat

Editováno 28.8.2014 18:54
 
Nahoru Odpovědět 28.8.2014 18:53
Avatar
Maxy_obr
Člen
Avatar
Odpovídá na Maxy_obr
Maxy_obr:

Což je další věc co sem nedomyslel proc mi to musí docházet tak pomalu...
V tom řípadě je tohle správně

$jmeno = 'Franta_$';
$kontrola='#[/$_^]#';
if(preg_match($kontrola,$jmeno)){
       echo"Neplatný vstup";
}

A ještě se zeptám proč je ten clear nevhodý i když ty znaky vyloučím neměli by se vstupy ošetřovat mysql_real_es­cape_string a htmlspecialchars používám vždy

Editováno 28.8.2014 19:32
 
Nahoru Odpovědět 28.8.2014 19:32
Avatar
Bertram
Člen
Avatar
Odpovídá na Maxy_obr
Bertram:

Proč a kdy se escapuje si přečti na phpfashion.com/es­capovani-definitivni-prirucka.

Editováno 28.8.2014 20:08
 
Nahoru Odpovědět 28.8.2014 20:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.