Merkkijonot voivat siis sisältää tiettyjä avainsanoja, jotka sitten korvataan koodissa määritellyillä arvoilla. Avainsanoja ovat esim. [CLASS]
(luokan nimi) ja [ID]
. Nyt vaan pitäis mennä tavallaan toiseen suuntaan, eli selvittää tiedostonimestä arvot avainsanoille. Näin haen tällä hetkellä classNamen:
<?php $filename = 'test.Example.php'; $pattern = '/' . str_replace( '[CLASS]', '(\w+)', 'test.[CLASS].php' ) . '/'; $matches = array(); preg_match_all( $pattern , $filename, $matches, PREG_SET_ORDER ); $className = end( $matches[ 0 ] ); ?>
Toimii kuin junan vessa. Paitsi sitten.. Ensinnäkin tuo näyttää hieman purkalta - onko tuohon parempaa tapaa? Nykyisellään tuo siis natsaa koko tiedostonimeen sekä sitten itse luokan nimeen, siitä syystä erikoinen PREG_SET_ORDER+end
-hässäkkä. Toisekseen, tuollaisenaan luokan nimi ei voi sisältää (regexp-?) erikoismerkkejä, kuten esimerkiksi väliviivaa (alaviiva kyllä käy). Tosin, ei kai sen pitäisi olla ongelma kunhan luokkien nimissä käytetään hyväksi havaittuja nimeämiskäytäntöjä?
EDIT: Vanhasta tottumuksesta törkkäsin tälle alueelle vaikka ei tämä nyt nettiin ole menossa muuten kuin ladattavaksi.
Onko määrityksillä [CLASS] ja [ID] tässä muuta virkaa, kuin että niiden avulla muodostetaan haluttu säännöllinen lauseke? Kelvollisessa tiedostonimessä voi tuskin olla monta luokan nimeä, joten funktio preg_match taitaa riittää. Tällöin säännöllisen lausekkeen päihin sopivat merkinnät ^ ja $ (alku ja loppu). Jos halutaan tunnistaa piste, sen eteen täytyy kirjoittaa kenoviiva, koska pelkkä piste tunnistaa kaikkea muutakin. Luokan nimessä voi olla mitä tahansa merkkejä, jos sen tunnistaa lausekkeella ([^.]+) tai jopa (.+), ja tietysti hakasulkujen väliin voi myös kirjoittaa juuri ne merkit, jotka ovat sallittuja luokan nimessä.
<?php $nimi = "test.*[A-B-C]*.php"; if (preg_match("/^test\\.([^.]+)\\.php$/", $nimi, $tulos)) { echo "Luokan nimi: " . $tulos[1]; } else { echo "Virheellinen tiedostonimi!"; } ?>
Joo siis nuo [KEYWORD] toimivat myös toiseen suuntaan (tiedostonimi muodostetaan templaten avulla):
<?php str_replace( '[CLASS]', $className, 'test.[CLASS].php' ) ?>
preg_match toimii. Määrittelin nuo regexp erikoismerkit, joita on mahdollista löytää myös tiedostonimistä (Windows, emt *NIX).
<?php $filename = 'test^!(.*+)[FOOBAR]{}.Example_Interface.php'; $tcPattern = 'test^!(.*+)[FOOBAR]{}.[CLASS].php'; $regexSpecials = array( '^', '$', '.', '+', '*', '(', ')', '[', ']', '{', '}' ); $regexSpecialsReplacements = array( '\\^', '\\$', '\\.', '\\+', '\\*', '\\(', '\\)', '\\[', '\\]', '\\{', '\\}' ); $pattern = str_replace( $regexSpecials, $regexSpecialsReplacements, $tcPattern ); $pattern = '/^' . str_replace( '\\[CLASS\\]', '(\w+)', $pattern ) . '$/'; $matches = array(); preg_match( $pattern, $filename, $matches ); ?>
EDIT: Unohin taas hetkellisesti, että miten saikaan aikaan hakasulut tekstiin. Helpompi olis muistaa backslashi.
Ettei vaan kukaan ota mallia niin samahan hoituu myös preg_quotella.
Aihe on jo aika vanha, joten et voi enää vastata siihen.