Autor Zpráva
Fisak
Profil
Zdravím... dodnes jsem používal fci ereg_repleca (především na ochranu proti sql injekci) ale prý mám používat radši preg_replace. Prosím o radu jak šikovně přepsat všechny ereg_replace když je mam ve formátu:
ereg_replace('[^0-9\a-z\-\_\.]', '', $_POST["$soubor_pld"]); 
panther
Profil
Fisak:
preg_replace, co konkrétně jsi nepochopil?
Fisak
Profil
panther:
ten rozdíl zápisu '[^0-9\a-z\-\_\.]'
Ugo
Profil
víceméně jedinej rozdíl je v delimetrech http://us.php.net/manual/en/regexp.reference.delimiters.php čili kolem toho výrazu ještě přidáš např #
Tori
Profil
Fisak:
Koukněte se případně na funkce filter_var a filter_input. Sice neumožňují* až tak restriktivní vyčistění řetězce, jaké v tomto případě chcete, ale mohly by se hodit.

* = ne implicitně, jedině pomocí callback funkce.
Fisak
Profil
takže ereg_replace('#[^0-9\a-z\-\_\.]#', '', $_POST["$soubor_pld"]); by mělo být správně ??
Joker
Profil
Fisak:
Jedna připomínka, proč píšete proměnnou do uvozovek?
YoSarin
Profil
Fisak:
preg_replace... A jak píše Joker - v "$promenna" jsou uvozovky dost nadbytečné...
Fisak
Profil
YoSarin:
jo sry... preg_replace a vynecham uvozovky


nevím proč ale stále mi při preg_replace('#[^a-z]#', '', $_POST["jazyk"]); hlásí chybu:
Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 54
YoSarin
Profil
Fisak:
A určitě to máš přesně tak jak se to tady zobrazuje? Není ta chyby na jiném řádku? Není tam navíc nějaké [? Není tam před ] zpětné lomítko?
Fisak
Profil
<?php 
if(isset($_POST["zmenit"]))
{
    //nastavení pluginů
    $slozka_u_pld = OpenDir ("plugins/usefull_plugins/");
    while(false !== ($soubor_pld = ReadDir ($slozka_u_pld))) { 
    
        if($soubor_pld != "." and $soubor_pld != ".." and $soubor_pld != "") {
        
            $form_soubor_pld=preg_replace('#[^0-9\a-z\-\_\.]#', '', $_POST[$soubor_pld]); 
    
            if($str_pld=db_system("SELECT * FROM options where type = '$soubor_pld'")) {
                
                db_system("UPDATE options set text = '$form_soubor_pld' where type = '$soubor_pld'");
    
            } else {
    
                db_system("insert into options (type, text) VALUES ('$soubor_pld', '$form_soubor_pld')");
    
            }
    
        }
    
    }
    
    //nastavení js pluginů
    $slozka_js_plgo = OpenDir ("js/plugins/");
    while(false !== ($soub_js_pl = ReadDir ($slozka_js_plgo))) { 
    
        if($soub_js_pl != "." and $soub_js_pl != ".." and $soub_js_pl != "") {
            
            $form_soubor_jspl=preg_replace('#[^0-9\a-z\-\_\.]#', '', $_POST[$soub_js_pl]); 
    
            if($str_js_pld=db_system("SELECT * FROM options where type = '$soub_js_pl'")) {
                
                db_system("UPDATE options set text = '$form_soubor_jspl' where type = '$soub_js_pl'");
    
            } else {
    
                db_system("insert into options (type, text) VALUES ('$soub_js_pl', '$form_soubor_jspl')");
    
            }
    
        }
    
    }
    
    //nastavení systému
    $vychozi_jazyk=preg_replace('#[^a-z]#', '', $_POST["jazyk"]); 
    $mod_rewrite=preg_replace('#[^a-z]#', '', $_POST["mod_rewrite"]); 
    $title=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\@]#', '', $_POST["title"]); 
    $nazev_webu=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\@]#', '', $_POST["nazev_webu"]); 
    $podnazev_webu=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\@]#', '', $_POST["podnazev_webu"]); 
    $vychozi_stranka=preg_replace('#[^0-9\a-z\-\_\]#', '', $_POST["vychozi_stranka"]); 
    $author=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\@]#', '', $_POST["author"]); 
    $seo_description=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\<\>\"\!\/\(\)\[\]\|\€\đ\Đ\ł\#\&\@\{\}\]#', '', $_POST["seo_description"]);
    $seo_keywords=preg_replace('#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\<\>\"\!\/\(\)\[\]\|\€\đ\Đ\ł\#\&\@\{\}\]#', '', $_POST["seo_keywords"]);
    $vzhled=preg_replace('#[^0-9\a-z\-\_\]#', '', $_POST["vzhled"]); 
    $image_player=preg_replace('#[^0-9\a-z\-\_\]#', '', $_POST["image_player"]); 
    $media_player=preg_replace('#[^0-9\a-z\-\_\]#', '', $_POST["media_player"]); 
    $form_plugin=preg_replace('#[^0-9\a-z\-\_\]#', '', $_POST["form_plugin"]); 
    $time_format=preg_replace('#[^0-9\a-z\-\_\:\ \.]#', '', $_POST["time_format"]); 
    $date_format=preg_replace('#[^0-9\a-z\-\_\:\ \.]#', '', $_POST["date_format"]);
    $pagination=preg_replace('#[^0-9\a-z]#', '', $_POST["pagination"]); 
    $num_pagination=preg_replace('#[^0-9]#', '', $_POST["num_pagination"]); 
?>
a chybu to vypisuje:
Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 54 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 96 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 56 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 96 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 57 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 58 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 59 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 60 Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 15 in /home/users/insignia/insignia.funsite.cz/web/admin/php_modules/options/index.php on line 61


ahaaa už sem na to přišel.. nesmí to končit \ tzn. ne takto '#[^0-9\a-z\-\_\]#' ale takto '#[^0-9\a-z\-\_]#'
panther
Profil
Fisak:
YoSarin v [#10] napsal: „Není tam před ] zpětné lomítko?
Samozřejmě, že tam je. Ale proč sem nevložit celý kód, ať se podívá někdo jiný, že?

Reguláry nejsou mojí nejsilnější stránkou, ale zdá se mi, že s těmi zpětnými lomítky zbytečně plýtváš, tolik jich tam snad třeba není, ne?
Ugo
Profil
Fisak:
ty reguláry sou ... zvláštní nicméně \ je escapujici znak, takže ho musíš escapovat taky (\\), ale obecně je jich tma opravdu hodně
Fisak
Profil
panther:
tolik jich tam snad třeba není, ne?
a jak by to tedy mělo vypadat ?
YoSarin
Profil
Fisak:
Ještě odbočím - uvažoval jsi co se stane s velkými písmeny? Tvůj regexp je smaže... Nemluvě o tom, že to bereš až moc konkrétně - není důvod aby se regexp pro název webu lišil od výrazu pro podnázev webu a titulek, ne? Myslím že na to by stačil jeden výraz...

Navíc - používáš-li utf-8, tak diakritika ti v tom může nadělat pěkný brajgl, pokud nepoužiješ příslušný modifikátor. Koukni konkrétně na modifikátory i a u.

Modifikátory se "přilepují" za koncové # (nebo jiný delimiter který si zvolíš):
#[^0-9\a-záčďéěíňóřšťúůýž\ \-\_\.\,\*\@]#ui.

Možná zvaž co přesně od těch funkcí chceš - třeba by se ti daleko víc hodila nějaká nativní funkce místo regexpu... A možná bys ještě mohl zkusit otestovat jestli ti místo tohohle zdlouhavého vypisování neposlouží víc třída [:alnum:]
Fisak
Profil
dobře přidal sem tam ui... a uvažoval sem u fci např. preg($co_muze_obsahovat, $string) { return preg_replace('#[$co_muze_obsahovat]#ui', '', $string);
Marek88
Profil
[#14] Fisak:
Tady máš něco o escapování. Myslím, že je to shrnuté dobře.
YoSarin
Profil
Fisak:
a uvažoval sem u fci např. preg
Jestli už jsi to přepsal z ereg do preg, tak tohle je zbytečné... Když jsem říkal "nativní funkce" měl jsem na mysli funkci která v PHP už je a možná by tvému účelu posloužila líp (jak psala už Tori). Ale to těžko říct - když nevíme co přesně vlastně mají ty fce za cíl...

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