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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: