PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
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.“
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)
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)
Dve tecky by sly vyloucit pomoci neceho takovehoto:
(\.\.){0}
Nebo se pletu?
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);
}
?>
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.
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 :)
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.“
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.
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.“
Mozna bych se vykaslal na nejaky sileny vlastnorucni validatory a sahnul po Zend_Validate_EmailAddress
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.“
vrtak-cz napsal(a):
… Je to pro overovani pri zakladani e-mailu.
V tom prípade je to samozrejme v poriadku ;)