Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Statie de epurare sau fosa septic...

Adaptor usb3.1gigabit vs Adaptor ...

La multi ani @Atreides!

La multi ani @KENSINGTON!
 La multi ani @burebista!

La multi ani de Florii!

Stihl fs 70 c-e

Challengers (2024)
 Care mai sunt mediile de admitere...

Laptop cu HDD atasare memorie MMC...

Hartile google nu mai au chenarul...

Tomate in ghiveci la curte?
 Idei cale de actiune recuperare g...

Intoleranța lactoza- vegan v...

Tobe acustice insonorizare in blo...

Cine canta? Fragment din melodie...
 

Username la inregistrare

- - - - -
  • Please log in to reply
8 replies to this topic

#1
phpguru

phpguru

    Junior Member

  • Grup: Members
  • Posts: 127
  • Înscris: 12.07.2012
Salut,

Vreau sa fac pt. inregistrarea unui username urmatoarele:
- Minim 4 si maxim 15 caractere care sa includa (obligatoriu: litere si optional: 0-9 _ . )
- Optional sa fie: minim 1 si maxim 4 numere
- Optional maxim: 1 _ (underscore)
- Optional maxim: 1 . (punct)

Variantele mele:

VARIANTA 1:
if ( preg_match( "/^[a-zA-Z]{4,15}(\d{1,4})?_?\.?$/", $nickname ) ) {
return true;
}

VARIANTA 2:
if ( preg_match( "/^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d_\.]{4,15}(?:\d{1,4})?_?\.?$/", $nickname ) ) {
return true;
}


Problema este ca depaseste maxim 4 numere, alteori ma obliga sa adaug cel putin 1 numar sau _ .

Edited by phpguru, 09 December 2023 - 20:38.


#2
gogu1905

gogu1905

    Member

  • Grup: Members
  • Posts: 774
  • Înscris: 03.05.2019
Doua variante: daca problema e de expresii regulare, nu e PHP si, probabil, mai potrivit sa mergi pe alta arie. Daca problema e de PHP, atunci scrie o functie de validare care sa verifice toate conditiile pe care le ai.

Edited by gogu1905, 09 December 2023 - 20:50.


#3
phpguru

phpguru

    Junior Member

  • Grup: Members
  • Posts: 127
  • Înscris: 12.07.2012
Am scris la functii de validare de mi-a venit rau. Nu reusesc sa fac exact ca-n conditiile de mai sus.

#4
MooF2010

MooF2010

    Senior Member

  • Grup: Senior Members
  • Posts: 5,337
  • Înscris: 24.05.2010
Ce vrea sa zica colegul e ca expresiile nu sunt PHP, ele sunt integrate in PHP. Trebuie sa gasesti in specialist in expresii nu in PHP.

Edited by MooF2010, 09 December 2023 - 21:03.


#5
iulian_1976

iulian_1976

    Active Member

  • Grup: Members
  • Posts: 1,576
  • Înscris: 10.05.2008
^(?=.*[a-zA-Z])[a-zA-Z0-9_.]{4,15}(?:\d{1,4})?(?:_?\.?)?$

Posibil sa te ajute chatgpt pentru regex.

Explicații pentru fiecare parte a expresiei:
^: Ancorează începutul șirului.
(?=.*[a-zA-Z]): Asigură că există cel puțin o literă în șir.
[a-zA-Z0-9_.]{4,15}: Potrivește litere, cifre, underscore și puncte, cu lungimea între 4 și 15 caractere.
(?:\d{1,4})?: Face ca grupul de cifre să fie opțional, dar, dacă există, să fie între 1 și 4 cifre.
(?:_?\.?)?: Face ca underscore și punctul să fie opționale, dar, dacă există, să fie maximum un underscore și maximum un punct.
$: Ancorează sfârșitul șirulu.

Deci:

if ( preg_match( "/^(?=.*[a-zA-Z])[a-zA-Z0-9_.]{4,15}(?:\d{1,4})?(?:_?\.?)?$/", $nickname ) ) {
return true;
}


Edited by iulian_1976, 09 December 2023 - 22:12.


#6
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,959
  • Înscris: 24.04.2013
Expresia regulata de mai sus nu mi se pare corecta, dar reprezinta un punct de plecare. Deficiente (din examinarea expresiei, fara a o fi testat, deci posibil sa ma si insel):
  • Testul explicit pentru numarul de cifre care ca cifrele sa fie consecutive. Din formularea initiala nu mi se pare decat ca trebuie sa fie cel putin una si maxim 4, dar plasate oriunde/ separate.
  • Pot exista oricat de multe cifre, puncte si underscore (in limita lungimii totale) din cauza testului cu numarul total de caractere.
  • 4 cifre + underscore + punct in aceasta ordine, fiecare din aceste 3 elemente fiind optional, le cauta ulterior la sfarsitul sirului si aceasta in plus fata de lungimea totala maxim admisa. (Cel putin eu gasesc ca (?:) inseamna ‘non capturing group’ si nu vreo ‘lookbehind assertion’.) Acest lucru se poate remedia usor folosind (?=)  ‘lookahead assertion’ plasat inainte de testul pentru cele 4…15 caractere, cum este testul de existenta a cel putin o litera.

Edited by sags, 10 December 2023 - 00:31.


#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,240
  • Înscris: 24.02.2007
N-as folosi regex pentru asa ceva. Cateva if-uri si numarat tipuri de caractere.

#8
andreyyshore

andreyyshore

    Member

  • Grup: Members
  • Posts: 643
  • Înscris: 23.02.2010
Dacă ții neapărat să folosești regex, o soluție este să creezi o funcție în care:
  • Să verifici dacă șirul original respectă expresia: /^[A-Za-z0-9_.]{4,15}$/
  • Să faci o serie de înlocuiri în cascadă cu "" (aș zice întâi /[A-Za-z]/, apoi /[0-9]/, apoi "_", apoi ".") și să verifici dacă diferența de lungime față de șirul anterior îți respectă condiția
    • Dacă, la vreun pas, condiția e respectată și rămâi cu un șir gol, validezi direct
    • La final, validezi fără să mai verifici dacă e șir gol, pentru că logic nu se poate altfel
Dar și eu aș face ca dani.user, s-ar putea să fie chiar un pic mai eficient dacă parcurgi șirul o singură dată.

#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,240
  • Înscris: 24.02.2007
$username = "abd123da._";
$len = strlen($username);
$letters = 0;
$digits = 0;
$underscore = 0;
$dot = 0;
foreach (str_split($username) as $c) {
	if (preg_match('/[a-zA-Z]/', $c)) $letters++;
	if (preg_match('/[0-9]/', $c)) $digits++;
	if ($c == '_') $underscore++;
	if ($c == '.') $dot++;
}
$is_valid = ($len >= 4 && $len <= 15)
	&& ($letters > 0)
	&& ($digits >= 1 && $digits <= 4)
	&& ($underscore <= 1) && ($dot <= 1);



Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate