PHP a regulárne výrazy

Programovacie jazyky, rady, poradňa...
atlox
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 230
Registrovaný: 15 aug 2006, 0:31
Bydlisko: Poprad
Kontaktovať používateľa:

PHP a regulárne výrazy

Príspevok od používateľa atlox »

Servuste všetci! :)

Poraďte mi, prosím, ako docieliť toto:
Na stránke mám registračný formulár. Tu sa budú nový užívatelia registrovať. No chcem obmedziť ich užívateľské mená IBA na znaky A-Z a-z 0-9 _ - (čiže veľké a malé písmená od 'a' do 'z', čísla od 0 po 9, podčiarník a pomlčku. MEDZERU NIE!). Ich mená majú mať zároveň maximálne 25 znakov. A ani za pi... neviem prísť na to ako to pomocou regulárnych výrazov v PHPčku docieliť. Už som skúsil všeličo, ale stále mi to napr. zoberie aj medzeru, a ak nevezme tú tak vezme napr. iný znak alebo sa stane niečo iné.

Poraďte PLS lebo mne už vlasy z toho vypadávajú...
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

php:

Kód: Vybrať všetko

<?php
$text = "123-Hello _ World!@#$";
echo $text."<br />";

$text = ereg_replace("[^-[:alnum:]_]","",$text);
echo $text."<br />";
?>
vystup:

Kód: Vybrať všetko

123-Hello _ World!@#$
123-Hello_World
vysvetlenie:
[^-[:alnum:]_]
v zatvorkach preto lebo to chces pre kazdy znak
^ znamena negaciu
- je pomlcka, musi byt po negacii hned na zaciatku
[:alnum:] su vsetky alfanumericke znaky
_ je asi jasne

funckiu if(strlen($text) > 25) ... uz urcite zvladnes :wink:
krasko
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 305
Registrovaný: 10 mar 2008, 5:02

Príspevok od používateľa krasko »

asi aj budes chciet vratit userovy error, takze

Kód: Vybrať všetko

<?php
$username = $_POST['nick'];

if (!ereg('^[a-zA-Z0-9_-]*$', $username)) $chyba .= 'neplatne znaky v username';
if(strlen($username) > 25) $chyba .= ', neplatna dlzka username';

if ($chyba) die('Neplatny nick: '.$chyba);

?>
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

bolo by dobre definovať aj minimálnu dlžku, a maximálnu netreba robiť cez strlen ale tiež to môžeš hodiť rovno do regulárneho výrazu:

Kód: Vybrať všetko

ereg('^[a-zA-Z0-9_-]{3,25}$', $username)
ground-tm
Expert
Expert
Používateľov profilový obrázok
Príspevky: 148
Registrovaný: 20 máj 2007, 16:25
Bydlisko: Teplička nad Váhom

Re: PHP a regulárne výrazy

Príspevok od používateľa ground-tm »

nebudem kvoli tomu zakladat novy thread, takze chcem aby vyhovovalo iba jednoslovne meno s diakritikou s prvym pismenom velkym. napisal som toto:

Kód: Vybrať všetko

ereg("^[A-Ž]{1}[a-ž]+$",$premenna)
vysledok je ze mi aj meno bez velkeho pismena na zaciatku zoberie ako spravne (o to by sa mala starat ta jednotka v zlozenych zatvorkach ale nestara sa).
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: PHP a regulárne výrazy

Príspevok od používateľa audiotrack »

1) používaš ereg, čo je zastaralá funkcia. Nemôžeš sa na ňu spolahnúť, a nie je viac podporovaná v php 5. Mal by si použiť preg_match
2) problém je v tom, že si to zapísal ako rozsah. Vyhodnocuje sa to na základe ordinálnych hodnôt. Veľké A má hodnotu 65, veľké Z má hodnotu 90. Potom idú malé písmena, a až potom znaky s diakritikou (napríklad Ž má hodnotu 142). Teda zapísaním A-Ž si definoval rozsah 64-142 ktorý pokrýva aj všetky malé písmena. Tvoj príkaz teda musí vyzerať asi takto:

Kód: Vybrať všetko

preg_match("/^[A-Z,Č,Ž,Ď]{1}[a-z]+$/",$premenna);
mne sa tam všetky písmenka s diakritikou nechcelo písať, tak som len pre ukážku použil iba tri
Napísať odpoveď