#1 před 3 lety

vrtak-cz
Nette Evangelist
Registrovaný: 8. 3. 2008
Příspěvky: 2026

Jak napsat toto jako jeden regulár?

Nejsem žádnej regulárGuru a tak bych potřeboval helfnout. Dá se tohle přepsat do jednoho reguláru?

<?php
function foo($data)
{
        if (!ereg("^[a-zA-Z0-9._-]+$", $data))
                return FALSE;
        elseif (strpos($data, "..") !== FALSE)
                return FALSE;
        elseif ($data[0] == "." || $data[0] == "_" || $data[0] == "-")
                return FALSE;
        elseif ($data[strlen($data)-1] == "." || $data[strlen($data)-1] == "_" || $data[strlen($data)-1] == "-")
                return FALSE;
        else
                return TRUE;
}
?>

Sorry my bad english.
Vrtak-CZ | Ace IT | Osobní Blog | Twitter | LinkedIn | GitHub | Nella Project | Hledáte práci?
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“

 

#2 před 3 lety

SniperCZE
Člen
Registrovaný: 6. 1. 2009
Příspěvky: 13

Re: Jak napsat toto jako jeden regulár?

Tak po chvili premejsleni editovano do teto podoby, ktera by mela bejt ok pro vsechno

<?php
eregi("^[a-z0-9][a-z0-9\._-]*[\.]{2}[a-z0-9\._-]*[a-z0-9]$");
?>

Cili „Zacni retezec, pak jedno pismeno nebo cislo, pak libovolnej (i 0) pocet znaku, pak dve tecky, pak zas libovolnej pocet znaku a nakonec pismeno nebo cislo“

Editoval SniperCZE (22. 5. 2009 13:11)

 

#3 před 3 lety

nAS
Člen
Registrovaný: 18. 12. 2008
Příspěvky: 261

Re: Jak napsat toto jako jeden regulár?

Ty 2 tečky by tam právě být neměly. Hádám, že to je na ověření platnosti první části e-mailu. Ale mám pocit, že v regulárních výrazech nepůjde nijak snadno udělat podmínka na vyloučení dvou teček za sebou. Já bych to dělal takhle:

<?php
if (preg_match('%^[a-zA-Z0-9]$%', $text) ||
        preg_match('%^[a-zA-Z0-9][a-zA-Z0-9\._-]*[a-zA-Z0-9]$%', $text) &&
                (strpos($text, '..') === FALSE))
        return TRUE;
else
        return FALSE;
?>

Ta první podmínka je pouze na ověření jednoho písmene. Pokud jedno písmeno projít nemá, tak se může vyhodit, jak to má SniperCZE.

preg_match jsem volil kvůli tomu, že je rychlejší.

Edit:

To jedno písmeno tam jde vlastně udělat takhle:

<?php
if (preg_match('%^[a-zA-Z0-9]([a-zA-Z0-9\._-]*[a-zA-Z0-9])?$%', $text) &&
        (strpos($text, '..') === FALSE))
        return TRUE;
else
        return FALSE;
?>

Editoval nAS (22. 5. 2009 14:46)


$application->run(); // Run Forrest, run!

@MartinMajor

 

#4 před 3 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 878

Re: Jak napsat toto jako jeden regulár?

Dve tecky by sly vyloucit pomoci neceho takovehoto:

(\.\.){0}

Nebo se pletu?

 

#5 před 3 lety

nAS
Člen
Registrovaný: 18. 12. 2008
Příspěvky: 261

Re: Jak napsat toto jako jeden regulár?

Já si myslím, že tohle fungovat nebude, protože to nedonutíš, aby to namatchovalo ty 2 tečky zrovna na tohle.

Ale když už jsi mě tak hezky vyhecoval, tak jsem se trochu zamyslel a tohle by snad mělo fungovat:

<?php
function foo($data) {
        return preg_match('%^[a-zA-Z0-9](([a-zA-Z0-9_-]+\.?)*[a-zA-Z0-9])?$%', $data);
}
?>

$application->run(); // Run Forrest, run!

@MartinMajor

 

#6 před 3 lety

kravco
Moderator
Registrovaný: 15. 6. 2008
Příspěvky: 791

Re: Jak napsat toto jako jeden regulár?

phx napsal(a):

Dve tecky by sly vyloucit pomoci neceho takovehoto:

(\.\.){0}

Nebo se pletu?

Tvoj regulárny výraz matchne čokoľvek (naozaj čokoľvek).

nAS napsal(a):

Já si myslím, že tohle fungovat nebude, protože to nedonutíš, aby to namatchovalo ty 2 tečky zrovna na tohle.

Ale když už jsi mě tak hezky vyhecoval, tak jsem se trochu zamyslel a tohle by snad mělo fungovat:

<?php
function foo($data) {
        return preg_match('%^[a-zA-Z0-9](([a-zA-Z0-9_-]+\.?)*[a-zA-Z0-9])?$%', $data);
}
?>

Dobrý smer, no stále to nestačí, neprejdú ti platné reťazce, ktoré majú na druhej pozícii bodku, napríklad „a.b“ alebo „a.bbbbbbbb“.

Trochu doplnený regulár by to mal zvládnuť:

/^[a-z0-9](?:\.?(?:[a-z0-9_-]+\.?)*[a-z0-9])?$/i

syntax (?: podvýraz ) je podobná ako ( podvýraz ) akurát sa výsledky z matchovania zátvorky nepamätajú (to teraz nepotrebujeme), je to speedup, najmä pri zložitejších výrazoch

pattern modifier //i robí matchovanie case insensitive – netreba vymenúvať veľké i malé písmená

viac info: PCRE manuál @ php.net

Hint: Na uzatváranie regulárnych výrazov používaj radšej jednoduché úvodzovky, ak naozaj nepotrebuješ dvojité… viď poznámka.

 

#7 před 3 lety

nAS
Člen
Registrovaný: 18. 12. 2008
Příspěvky: 261

Re: Jak napsat toto jako jeden regulár?

kravco napsal(a):

Dobrý smer, no stále to nestačí, neprejdú ti platné reťazce, ktoré majú na druhej pozícii bodku, napríklad „a.b“ alebo „a.bbbbbbbb“.

Jasně, máš pravdu. Teď už by to snad fakt mělo být ok :)


$application->run(); // Run Forrest, run!

@MartinMajor

 

#8 před 3 lety

vrtak-cz
Nette Evangelist
Registrovaný: 8. 3. 2008
Příspěvky: 2026

Re: Jak napsat toto jako jeden regulár?

Díky všem

nAS napsal(a):

Hádám, že to je na ověření platnosti první části e-mailu.

Hádáš správně


Sorry my bad english.
Vrtak-CZ | Ace IT | Osobní Blog | Twitter | LinkedIn | GitHub | Nella Project | Hledáte práci?
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“

 

#9 před 3 lety

kravco
Moderator
Registrovaný: 15. 6. 2008
Příspěvky: 791

Re: Jak napsat toto jako jeden regulár?

Díky všem

nAS napsal(a):

Hádám, že to je na ověření platnosti první části e-mailu.

Hádáš správně

V tom prípade (najmä ak sa jedná o maily mimo tvojej domény), odporúčam preštudovať niečo o tom, že platná emailová adresa môže naozaj vyzerať divokejšie, napríklad na wikipédii alebo priamo v RFC.

Sám som používal adresu v tvare -example-@example.com, ktorá neprešla viacerými validátormi aj keď je úplne v poriadku podľa RFC.

 

#10 před 3 lety

vrtak-cz
Nette Evangelist
Registrovaný: 8. 3. 2008
Příspěvky: 2026

Re: Jak napsat toto jako jeden regulár?

kravco napsal(a):

V tom prípade (najmä ak sa jedná o maily mimo tvojej domény), odporúčam preštudovať niečo o tom, že platná emailová adresa môže naozaj vyzerať divokejšie, napríklad na wikipédii alebo priamo v RFC.

To jsem studoval a taky sem studoval ktere adresy podle RFC jsou ok a presto nemuseji fungovat. Proto jsem zvolil variantu ktera je popsana vyse. Je to pro overovani pri zakladani e-mailu.


Sorry my bad english.
Vrtak-CZ | Ace IT | Osobní Blog | Twitter | LinkedIn | GitHub | Nella Project | Hledáte práci?
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“

 

#11 před 3 lety

SniperCZE
Člen
Registrovaný: 6. 1. 2009
Příspěvky: 13

Re: Jak napsat toto jako jeden regulár?

Mozna bych se vykaslal na nejaky sileny vlastnorucni validatory a sahnul po Zend_Validate_EmailAddress

 

#12 před 3 lety

vrtak-cz
Nette Evangelist
Registrovaný: 8. 3. 2008
Příspěvky: 2026

Re: Jak napsat toto jako jeden regulár?

jenomže já nechci validovat e-mailovou adresu ale jenom to co je před @. A vystačím si s jednoduchým regulárem.


Sorry my bad english.
Vrtak-CZ | Ace IT | Osobní Blog | Twitter | LinkedIn | GitHub | Nella Project | Hledáte práci?
„Nastala chyba která neměla nastat“ aneb „Když se chce všechno jde.“

 

#13 před 3 lety

kravco
Moderator
Registrovaný: 15. 6. 2008
Příspěvky: 791

Re: Jak napsat toto jako jeden regulár?

vrtak-cz napsal(a):

… Je to pro overovani pri zakladani e-mailu.

V tom prípade je to samozrejme v poriadku ;)

 

Zápatí