ugrás a tartalomhoz

Hivatkozás külön-külön az ismétlödö mintákra

Ronyn · 2007. Okt. 21. (V), 12.09
Sziasztok.
A következö lenne a problémám:
Egy css-re szeretnék mintát illeszteni-ezzel önmagában nincs is gond-de az alábbi problémára nem találtam elegáns megoldást.
Egy html tag után,több selector is álhat,illetve tulajdonság:érték párbol is tetszöleges számu lehet,ezt le lehet fedni egy sokszorozoval,de akkor csak az utolso találatot adja vissza, és külön akarok hivatkozni az összes tulajdonságra, :-ra,értékre,etc...
Meglehet-e oldani hogy egy pl. az értékre hivatozo részminta kulon adja vissza a találatokat?
 
1

Mit?

janoszen · 2007. Okt. 21. (V), 13.52
Fuss neki mégegyszer. Reguláris kifejezéssel szeretnél selectorokat parzolni vagy mi?
2

Kodszinezés

Ronyn · 2007. Okt. 21. (V), 14.10
-t szeretnék csinálni css fájlban.Ugy hogy a selector(ok) külön szinnel,a vessző megint külön,más színű a tulajdonság és más az érték etc...
Hogy tudnám azt megoldani hogy tetszőleges számu tulajdonság:érték párra(vagy selectorra) illeszkedjen a minta ,de mindeggyik párt visszaadja(mert ha csak sokszorozó kvantor?.al csinálom,akkor csak az utolsó találatot adja vissza)(és ugye a párra illeszkedő mintán belül is van 4 részminta ami rendre a (tulajdonság(1) :(2) érték(3) ;(4))?
3

Weaverslave

janoszen · 2007. Okt. 21. (V), 15.24
Nézd meg a Weaverslave kódszinezését, az is regexpekkel van megcsinálva.
4

Weaver?

Ronyn · 2007. Okt. 21. (V), 16.27
Aztatat hol találom?vagy mi az konkrétan?
A'sszem nem ismerem...

szerk.:közben találtam egy windows-os; ilyen nevü progit,csak nem arra gondolsz?
5

De.

janoszen · 2007. Okt. 22. (H), 08.22
De, pontosan arra gonodolok. A beállításaiban nézd meg a CSS mintaillesztéseit.
6

Selector

Ronyn · 2007. Okt. 22. (H), 12.35
Nem tudom Te mire gondolsz,de én abban összesen egy részmintát találtam,ami az osszes selectorra illeszkedik,konkrétan mindenre,az elsö {-ig, vagyis korántsem jelent számomra megoldást.
Vagy Te valami másra gondoltál?
7

Jó kérdés, de nem lehet megoldani, egy mintába nem fér bele

Fraki · 2007. Okt. 22. (H), 17.36
Jó kérdés, de nem lehet megoldani, egy mintába nem fér bele.

A zárójeleket nem lehet kvantifikálni, mert tudni kell, hogy pontosan melyik sorszámú hivatkozás melyikre vonatkozik.

Neked valamiféle rekurzív találati tömbre volna szükséged, ami nem lehetséges. A preg-et nézve, a preg_match egydimenziós tömböt ad vissza, és annak az elemei a zárójelek, a befoglalás sorrendjében (minden minta en bloc implicit zárójelezve van, ez a 0 elem); a preg_match_all pedig kétdimenziós tömböt ad, melyben a felső zárójeles szint alá vannak beosztva az globális találatok, tehát a struktúrája is más, mint amire neked szükséged volna. (Neked a zárójelek alá a részminták találatai kellenének.)

Úgy is fogalmazhatunk, hogy a preg_match_all nem applikálható részmintákra, minden részmintának külön preg_match_all kell.

Nehéz ügy, mert előbb a selector blokkokat kéne kinyerni, azokhoz viszont alacsonyabb szintű elemzés is kell, tehát regex-szel mindenképp redundáns lesz az elemzés. És ugye kezelni kell a kommenteket és a string literálokat, amit a kódszínezők valószínűleg nem regexszel csinálnak. (Bár, ki tudja, okos lookahead-ekkel talán meg lehet oldani...)
8

nem is kell egy mintába

Hodicska Gergely · 2007. Okt. 22. (H), 22.37
Szerintem ez tipikuan olyan feladat, amit a preg_replace_callback függvény segítségével meg lehet oldani. A minta csak az egyes szabályokat kell megtalálja, az azon belüli feldolgozást a callback függvényen belül lehet megoldani (akár egy regexppel).


Üdv,
Felhő
9

nem visz közelebb

Fraki · 2007. Okt. 23. (K), 02.32
Ha nem egy mintával dolgozom, hanem több szinten parse-olok, arra ugyanúgy jó a preg_match_all is. (Ha nem akarok replace-elni, akkor a kettő szinte ekvivalens.)

De persze ez az egész így csak egy egyszerűsített parser lesz, ami könnyen meg tud bukni, ha mondjuk kapcsos zárójel van egy fájl nevében. Normális parse-olást alulról felfelé kell csinálni, előbb tokenizálva (nyelvtan – ez hasznos lehet Ronynnak is, mert a tokenek regex-ek).

Szerk. Az utóbbit is lehet regex-ekkel, szerencsére a css-nek elég egyszerű a nyelvtana. Meg kell jelölni a tokeneket egyedi szimbólumokkal, utána már könnyű lehet a nyelvtani szintre megírni a regexet. Vagy ha valaki ezzel nem akar sokat szöszölni (bár megéri, mert korrektebb és szebb megoldás lesz), még akkor is hasznos lehet valamilyen lexikális szűrés, mondjuk a kommentek kiszűrése.
10

fájl neve?

Hodicska Gergely · 2007. Okt. 23. (K), 14.20
ami könnyen meg tud bukni, ha mondjuk kapcsos zárójel van egy fájl nevében
Hogy jön képbe a fájl neve a parse-olásban?

A preg_replace_callback meg szerintem erre a feladatra egyszerűbb kódot eredményez, mint két egymásba ágyazott ilesztés. Persze itt is ez történik, de átláthatóbb lesz némileg a kód.


Üdv,
Felhő
13

e modositó

Ronyn · 2007. Okt. 23. (K), 17.36
Végülis összejött,igaz maradtam a preg_replace-nél egy e modosítóval-kinyerem a { jelek közti szoveget amit aztán egy másik függvény bont szét elemeire.
Végül belejöttem,lett egy class colorer belőle,kezeli a php fájlokat is(php,html,css vegyesen).
A php részt azt a token_get_all() függvénnyel oldottam meg,és sajna az a leggyengébb eddig(a stringeken elég sürün elhasal).
Lehet a php szinezést is saját függvénnyel oldom meg...
Na meg még a js-t kell(ene) beleintegrálni valahogy...
11

fájl neve

Fraki · 2007. Okt. 23. (K), 17.16
Hogy jön képbe a fájl neve a parse-olásban?

#id { background: url('bg{5}.jpg'); }

de átláthatóbb lesz némileg a kód.
preg_match_all(..., rules);
foreach rules as rule {
  preg_match_all(..., props)
}

vs.

preg_replace_callback(..., rules, ...)
function rules() {
  preg_match_all(..., props);
//  return ...
}
12

sorry

Fraki · 2007. Okt. 23. (K), 17.17
sorry, félrement a válasz
14

szerk

Fraki · 2007. Okt. 23. (K), 17.36
szerk.

A replace-es verzióhoz még hozzá kell tenni, hogy replace-kor nem jön létre találati tömb, így ha későbbi vizsgálatra van szükség, vagy valamiért szükség van a rules eredménytömbre (elég hihető), akkor bővül:
$rules = array();
preg_replace_callback(..., 'rules', ...)  
function rules() {
  global $rules;
  $rules[] = $rule;
  preg_match_all(..., $rule, $props);  
//  return ...  
}
(És mondanom sem kell, hogy nem akarunk replace-elni... (ezt jelzem a kikommentelt return-nel) A replace_callback elsősorban replace-kor tud nagy segítség lenni, amikor a visszahivatkozások komplex feldolgozást igényelnek a cseréhez. Ha nincs csere, akkor nem sokmindent tesz hozzá a match_all-hoz.)
15

nem okoz gondot

Hodicska Gergely · 2007. Okt. 23. (K), 18.19
#id { background: url('bg{5}.jpg'); }
Ez szerintem megfogalmazható regexp szinten is, de amúgy sem hiszem, hogy ez egy gyakorlati akadály lenne.

Átláthatóbb kód témaköre: ahol használod, ott egyik esetben van egy darab preg_replace_callback, másik esetben egy függvényhívás, aminek az eredményétől függően kell végigiterálni egy tömbön (ez utóbbit rejti el előled a preg_replace_callback).

És mondanom sem kell, hogy nem akarunk replace-elni...
A highlight szeintem pont tipikusan szövegcsere, a végeredményt úgy kapod meg, hogy az eredeti szöveg egyes részeit beburkolod valamikbe, mainek tudsz stílusokat adni.


Üdv,
Felhő
16

replace OK, tokenizálni kell

Fraki · 2007. Okt. 23. (K), 19.43
Valószínűleg az egész css nyelvtan (cfg) megfogalmazható regexp szinten, mert nincs benne rekurzió, kérdés, hogy megéri-e. És újra ott tartunk, hogy a szintaxis szintjén lexikális elemekkel (tokenekkel) foglalkozunk. Hogy ez mennyire okoz gyakorlati akadályt, azt esete (meg a parserrel szembeni elvárás) határozza meg.

Tévedtem, tényleg replace-elni kell, túlságosan a topikindító bejegyzésre koncentráltam.

Viszont a kódszínezés tipikusan csak tokenizálást igénylő feladat, szóval a szabályblokkok felismerésére szerintem nincs is szükség.
17

Token kevés

Ronyn · 2007. Okt. 23. (K), 20.22
szerintem,mert a html tagokat,css tulajdonságokat lehet tokenként kezelni(én is ugy csinálom),de pl. egy tulajdonság értékét,vagy egy css selectort,csak ugy találsz meg ha bizonyos szabályok alapján keresed...
Szerintem...:D
18

Tényleg kevés.

Fraki · 2007. Okt. 24. (Sze), 00.33
Tényleg kevés.

Végülis akkor hogy oldottad meg a property-value szétválasztást? Vagy a selectorokra/rule-setekre mi a regexed (ha regexet használsz rá)? Simán /\{.*?\}/ ?

Stringeket, kommentet hogy kezeled? (Példa fent.)

És hogy lehet, hogy a token_get_all() elhasal a stringeken, mikor a php lexerét használja?
19

Triviális

Ronyn · 2007. Okt. 24. (Sze), 01.39
megoldást választottam,egyszerüen abbol indultam ki,hogy (ha jol emlékszem),a selectorokat vesszövel,a tul.,érték párokat kettösponttal kell elválasztani és lezárni egy ; -vel.
Ugy hogy a kezdö html tagot(ha van) helyben cserélem(hátránya hogy csak 1 tagot talál meg,de ez nekem is most jutott eszembe hogy abbol is lehet tobb :D))(ha tobb van akkor egyelore selectorként szinezi,ugyhogy megvan a holnapi piszkálni valo)),aztán az {-ig terjedö részt,egy másik fuggvény bontja szét elemeire.
A két {} kozti részt,meg egy 3. fuggvény,az emlitet határolok mentén.
A html hasonlo csak mivel ott nincs határolo,ezért preg_match_all keresi a tul="érték" párokat.(az értéken kivul adott listábol,vagyis tokenként kezeli,htmlt,css-t is)
A komment... hát az még alap,html,sortörésre nem illeszkedik,de annak egyelore nem is tulajdonitottam fontosságot.
Mivel esetenként a css-t is kommentek közzé zárjuk,ezzel még lessz munka
.
Amin magam is meglepödtem,hogy az esö proba után,a különbözö részek/tagok közzé beszurtam 3-4 sortörést,és ugy is hibátlanul illeszkedett)):D
A php érdekesen csinálja.
Pl.: egy print"<b>..."; esetén a két <> az T.STRING,a "b" pedig T.ENCHAPSED AND WHITESPACE(ha jol emlékszem a nevére).
Az egész fájlt átadom neki,szoval nem tudom.
Leginkább olyankor fordul elö,ha változo van a stringben,pl.: "...action=\"$_SERVER[PHP_SELF]\" "
gondolom az zavarja be,hogy az indexnél nincs aposztrof,pedig-tudtommal-ez szabályos(stringen belül)...
20

Aham.

Fraki · 2007. Okt. 24. (Sze), 02.21
Aham. Engem most csak a css-en belüli rész érdekelt (a többi kicsit magas nekem). Akkor ezzel végülis megbírkózik?

#id {
  background: url('asdf{1}.jpg');
}
És a css kommenteket (/* ... */) színezi?
21

Komment

Ronyn · 2007. Okt. 24. (Sze), 14.42
A css kommentet kommentként szinezi,mint a html kommentet is.
Még ilyen extrém mintát is kezel
/

*
cssszoveg

*

/
A html kommentnél szintén jo,meg
<style...-n belüli kommentrészt is szinezi(<!-- és -->)
a kép{5}.jpg még nem megy de,majd kitalálok valamit :D
Végülis még nincs kész(teljesen
talán sose lesz),és biztos van/lesz olyan extrém eset amin elhasal,de ezt bele kell kalkulálni,mint minden olyasmibe,ami bizonyos szabályszeruségekre épit...

PS:Kozben a
kep{5}.jpg problémát is sikerult megoldani,igy már azt is helyesen kezeli...
22

Komment

Ronyn · 2007. Okt. 24. (Sze), 16.32
A css kommentet kommentként szinezi,mint a html kommentet is.
Még ilyen extrém mintát is kezel
/

*
cssszoveg

*

/
A html kommentnél szintén jo,meg
<style...-n belüli kommentrészt is szinezi(<!-- és -->)
a kép{5}.jpg még nem megy de,majd kitalálok valamit :D
Végülis még nincs kész(teljesen
talán sose lesz),és biztos van/lesz olyan extrém eset amin elhasal,de ezt bele kell kalkulálni,mint minden olyasmibe,ami bizonyos szabályszeruségekre épit...

PS:Kozben a
kep{5}.jpg problémát is sikerult megoldani,igy már azt is helyesen kezeli...
mondjuk egy kep { 5 } .jpg esetén elhasalna,de ez van....

Mondjuk az általam ismert szerkesztök jo része,még
ennyit sem tud,és az igazán jokban is vannak hibák(css-t kommentként szinezi mert ki van kommentezve)...
A fentebb emlitett szerkesztönek pl. elég gyenge a kodszinezése...