|
Oleks vaja täiendada MiniBB foorumi mootorit nii, et [code]...[/code] elementide vahelist teksti näidataks veebilehel sellisena nagu see elementide vahel redaktoris välja näeb. Foorumi PHP-mootoris tehakse kõik asendused PCRE (Perli regulaaravaldiste) abil. Siin on kood, mida praegu kasutan:
Asendus peaks asendama alustavad ja lõpetavad nurksulud [ ] vastvate HTML koodidega [ ja ], et varjata neid edasiste asenduste eest, kuid tundub, et asendus tehakse stringis vaid esimese sulu puhul. Kuidas ma modifitseeriksin neid avaldisi, et asendataks kõik leitud juhud? Tulemus peaks olema selline:
praegune asendus aga on selline:
|
Elegantne lahendus. Ning uurinud PHP manuaali /e modifikaatori kohta ei näe ma ka mingit turvaprobleemi.
(Dec 03 '09 at 13:20)
Rene Saarsoo ♦♦
Proovisin seda lahendust, kuid selgus järgmine häda: reavahetusi sisaldavad tekstid ei läbi seda koodi. echo preg_match("/[code](.+?)[/code]/i","[code][b]test[/b]n[i]test2[/i][/code]"); väljastab 0. Samas echo preg_match("/[code](.+?)[/code]/i","[code][b]test[/b][i]test2[/i][/code]"); väljastab 1. Proovisin erinevaid võimalusi, kuid ei leidnud lahendust.
(Dec 03 '09 at 20:21)
Teet
Proovi modifikaatori
(Dec 03 '09 at 20:35)
Rene Saarsoo ♦♦
|
|
Jah, Su praegune kood asendab ainult esimest nurksulgu kummastki sordist iga [code]...[/code] jupi sees. See on sellepärast, et see kood otsib [code]...[/code] juppe, mille vahel vähemalt üks nurksulg leidub ning milles pesitsevale nurksulule vähemalt üks märk järgneb, jagab [code]...[/code] jupi sisu esimese nurksulu kohalt kaheks ja genereerib iga [code]...[/code] jupi jaoks väljundi, mis koosneb esimesest osast, vasaku nurksulu asendusest ja teisest osast. Regulaaravaldise küljest: Kui Sa tahad [code]...[/code] juppides kõiki nurksulge asendada, pead nood jupid eraldi asendusmehhanismist läbi laskma. Üht viisi on sigamozart juba demonud; kuna see sõltub täitmisajal stringina genereeritud koodi interpreteerimisest, mis minul veebirakenduste kontekstis turvakarvad turri ajab, räägin nüüd teisest võimalikust lahendusest. Alustame inimsõbralikus keeles kirjutatud pseudokoodist.
Perli split'il on omadus lõikemallis sätestatud grupid, if any, kenasti tagastatavasse listi paigutada. Kui me teame, kui palju neid tükke igas lõikekohas on, saame genereeritud listist hõlpsasti õiged tükid välja valida. Nüüd võtame sõnaraamatu ja tõlgime selle pseudokoodi PHP'sse.
Parandus: ülalmainitud /s on ka selles lahenduses puudu. Lisatud. 1
Esimest korda näen, et keegi nimetab Perli inimsõbralikuks pseudokoodiks :)
(Dec 03 '09 at 13:11)
Rene Saarsoo ♦♦
Konteksti küsimus. ;-)
(Dec 03 '09 at 20:48)
dig
Ma ei saa hästi aru, kuidas siinset pakutud funktsiooni praktikas kasutada, sest sisendtekstile rakendamist ei ole siin näidatud. Mõtlesin ka välja oma lahenduse: kuna mul on $msg väärtus käes enne $pattern ja $replacement-massiivi kasvatamist, saan sellele stringile rakendada sulge avaldavaid regulaaravaldisi nii kaua, kui nende "match" tõene on, ning lasen seejärel originaalkoodil $msg-muutujat edasi töödelda. Rohmakas, aga turvalekketa.
(Dec 03 '09 at 21:16)
Teet
1
Võib-olla ei saa ma murest õigesti aru, aga mispärast $msg = teetquote($msg); seda ei lahenda?
(Dec 03 '09 at 23:48)
dig
Puust ette ja punaseks, aitäh.
(Dec 04 '09 at 22:56)
Teet
|
