Autor | Zpráva | ||
---|---|---|---|
Sitole Profil |
Dobrý den, řeším menší problém ohledně kontroly existence údajů v poli. Je možné, že ani název tématu neodpovídá tomu co hledám, ale nevím od čeho se odpíchnout.
Mám pole obsahující následující údaje (Jedná se pouze o příklad a v aplikaci bude stránek mnohem více) array("clanky/(.*?)/komentare", "kontakt/autor", "kontakt", "clanky"); Poté dostanu již zadanou adresu například clanky/12345/komentare a potřebuji zjístit do jakého o jakou hodnotu z pole se jedná. To by nebyl problém. Prošel bych celé pole a adresu bych porovnal. Problém nastává ve chvíli, kdy místo 12345 může být libovolné číslo. Jak mám problém nejlépe řešit nějak elegantně?
Předem děkuji. |
||
Keeehi Profil |
#2 · Zasláno: 24. 4. 2017, 18:14:53
Uděláš to úplně stejně. Projdeš pole a porovnáš to. Jen místo operátoru
=== pouziješ funkci preg_match , protože v tom poli máš regulární výrazy.
Ten první regulární výraz povoluje nejen aby tam mohlo být jakékoli číslo, ale o jakýkoli jiný řetězec. |
||
Sitole Profil |
Keeehi:
„Uděláš to úplně stejně. Projdeš pole a porovnáš to. Jen místo operátoru === pouziješ funkci preg_match , protože v tom poli máš regulární výrazy.“
Pokouším se to rozjet následujícím kodem $Address = "clanky/12345/komentare"; $Map = array( "/\/Clanky/" => "Clanky.php", "/\/Clanek\/(*.)\//" => "Blog.php", "/\//" => "Main.php" ); foreach ($Map as $Key => $Value) { if (preg_match($Key, $Address, $Matches, PREG_OFFSET_CAPTURE)) { echo "Obsauje: " . $Key; echo $Matches[0]; } } Přičemž mně na výstupu vyhazuje PHP varování Warning: preg_match(): Compilation failed: nothing to repeat at offset , ale podmínka se splní až na konci procházení u poslední částí pole, která je obecná, ale nezastaví se u klíče 1, kde je přesný tvar. Moc netuším kde mám hledat chybu.
Jako $Key tedy nevypíše očekávané "/\/Clanek\/(*.)\//" , ale až konečné "/\//" .
|
||
Keeehi Profil |
#4 · Zasláno: 24. 4. 2017, 21:49:17
Ten regulár jsi špatně přepsal. Z
(.*?) jsi udělal (*.) . To prohození hvězdičky a tečky vyvolává tu chybu při kompilaci.
Dále i když bys to opravil, tak /\/Clanek\/(*.)\// rozhodně nematchuje tu adresu. 1) regulár je case sensitive, pokud mu neřekneš jinak 2) clanek - clanky: vždyť tam jsou jiná písmenka.
Další věcí je, že tam nemáš ošetřené to, že ten regulár má matchovat celý řetězec. Což zřejmě chceš, když vytváříš router. Já bych to udělal takto. |
||
Časová prodleva: 7 let
|
0