Php-ban mit lehet x helyére írni, hogy ez igaz legyen? If(x == "999"){...}
Végtelen sok lehetőség van, ezekből néhány:
true
"999"
999
true || "555"
1000-1
(1 << 10) - 25
992 | 7
Arra gondolsz, hogy $x nemcsak számokat tartalmazhat, hanem wildcard mintákat is, és pl ha x-nek az a tartalma, hogy csillag, akkor is teljesüljön a feltétel, meg akkor is, ha x épp 999, sőt akkor is, ha x mondjuk az, hogy 9?9, de mondjuk akkor ne, ha x 567?
Szóval ilyesfajta intelligens, patternekkel kiegészített összehasonlító művelet?
Akkor azt úgy lehet megoldani, hogy az if feltételben az szerepelne, hogy (példák):
if (preg_match('/.*/', 999)) {...} ----> lefutása: IGEN
if (preg_match('/9.9/', 999)) {...} ----> lefutása: IGEN
if (preg_match('/9.5/', 999)) {...} ----> lefutása: NEM
Ha az ember egyszerűbb wildcardokat akar használni regexpek helyett, akkor ehhez egy, az egyéni kis wildcard-nyelvből a regexpek nyelvére ,,fordító'' kis segédalgoritmust kell írni:
function wildcardToRegexp($wildcard): string {$rawRegexp = str_replace(['/\\?/', '/\\*/'], ['.', '.*']); return "/$rawRegexp/";}
A fordítás példái:
wildcardToRegexp('*') -----> '/.*/'
wildcardToRegexp('9?9') ---> '/9.9/'
wildcardToRegexp('999') ---> '/999/'
wildcardToRegexp(999) ----> '/999='
És ezt felhasználva működhetne is a dolog:
function compareWildcard($wildcard, $value): bool {return preg_match(wildcardToRegexp($wildcard), $value) > 0;}
A példák erre az összerakott működésre:
compareWildcard(999, 999) ---> eredménye true
compareWildcard('999', 999) ---> eredménye true
compareWildcard('*', 999) ---> eredménye true
compareWildcard('9?9', 999) ---> eredménye true
compareWildcard('9?5', 999) ---> eredménye false
compareWildcard('9??', 999) ---> eredménye true
compareWildcard('??9', 999) ---> eredménye true
compareWildcard('??2', 999) ---> eredménye false
compareWildcard('???', 999) ---> eredménye true
compareWildcard('*', 999) ---> eredménye true
így össze is lehet rakni a dolgokat:
if (compareWildcard('999', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard(999, 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('*', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('9?9', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('9?5', 999) {} ----> nem fut le, mert a feltétel nem teljesül
if (compareWildcard('9??', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('??9', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('??2', 999) {} ----> nem fut le, mert a feltétel nem teljesül
if (compareWildcard('???', 999) {} ----> lefut, mert a feltétel teljesül
if (compareWildcard('*', 999) {} ----> lefut, mert a feltétel teljesül
Ilyesfajta mintázatos segédfüggvényeket én akkor szoktam használni, ha pl. egy saját egyéni mini kis webalkalmazás-keretrendszerhez routert készítek.
A kis hibákat, elgépeléseket javítom, és íme a segédfüggvények, és a teszt is a végén:
<?php
function wildcardToRegexp($wildcard): string {$rawRegexp = str_replace(['?', '*'], ['.', '.*'], $wildcard); return "/$rawRegexp/";}
function compareWildcard($wildcard, $value): bool {return preg_match(wildcardToRegexp($wildcard), $value) > 0;}
echo [
compareWildcard(999, 999),
compareWildcard('999', 999),
compareWildcard('*', 999),
compareWildcard('9?9', 999),
compareWildcard('9?5', 999),
compareWildcard('9??', 999),
compareWildcard('??9', 999),
compareWildcard('??2', 999),
compareWildcard('???', 999),
compareWildcard('*', 999)
] == [
true,
true,
true,
true,
false,
true,
true,
false,
true,
true
];
Szívesen, örülök, hogy tényleg ilyesmi lett.
Két munkában nem használtunk szabványos webkeretrendszert, hanem saját kis keretrendszert kellett írnunk, és ott a route-ok feldolgozásánál merültek fel hasonló dolgok: afféle kis beágyazott mininyelveket próbáltunk kitalálni. Aztán persze ezeket regexp-es segédfüggvényekkel valósítottuk meg meg dolgoztuk fel.
[
'/student/([0-9]+)' => [
'GET' => [StudentController::class, 'show', ['intval'] ],
'POST' => [StudentController::class54, 'update', ['intval'] ]
],
...
...
'/doc/([a-z\-]+)' => [
'GET' => [HomeController::class, 'doc', ['strval'] ]
],
...
...
]
Sok sikert kívánok a projektedhez!
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!