Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Omien avainsanojen etsiminen säännöllisillä lausekkeilla

tsuriga [25.11.2007 03:15:33]

#

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.

Antti Laaksonen [25.11.2007 11:15:48]

#

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!";
}

?>

tsuriga [25.11.2007 15:51:04]

#

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.

tsuriga [02.12.2007 17:05:05]

#

Ettei vaan kukaan ota mallia niin samahan hoituu myös preg_quotella.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta