Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Parser za UBB-oliki kôd

[es] :: PHP :: Parser za UBB-oliki kôd

[ Pregleda: 2902 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Parser za UBB-oliki kôd07.06.2003. u 14:26 - pre 254 meseci
Evo jednog parsera za kod koji liči na UBB/TForum, a zapravo je sličniji sa SGML-om.

Code:

<?php
  // parser za sadržaj stranice, pronalazi kodove oblika \[[-a-zA-Z0-9._]+(\s<parametri>)?\]

/* Spisak jednostavnih oznaka, ostale su složene, tj. potrebna je
    posebna funkcija za njihovu obradu 
*/

$sve_oznake = array (
         "b" => array('<em class="bold">','</em>'),
         "i" => array('<em class="kurziv">','</em>'),
         "crveno" => array('<em class="crveno">','</em>'),
         "naslov" => array('<h1>','</h1>'),
         "podnaslov" => array('<h2>','</h2>'),
         "podpodnaslov" => array('<h3>','</h3>'),
         "linija" => "<hr>",
         "lista" => array("<ul>","</ul>"),
         "stavka" => array("<li>","</li>"),
               "email" => array("<a href=\"mailto:[adresa]\">","</a>"),
         );

/*
 
 Obrađuje pojedinačnu oznaku, tj. sve što se nalazi između "[" i "]".
 Znak na $txt[$poz-1] treba da bude '[', a vraća se pozicija ']'.

*/

function obradi_oznaku(&$txt,$poz=0) {
  $oznaka='';
  $origstr='';
  while (dozvoljeno_u_oznaci($txt[$poz])) {
    $origstr .= $txt[$poz];
    $oznaka .= $txt[$poz++];
  }

  $atributi=array();
  while ($poz<strlen($txt) and $txt[$poz]!=']') {
    if (razmak($txt[$poz])) {
      $origstr .= $txt[$poz];
      $poz++;
    } elseif (dozvoljeno_u_oznaci($txt[$poz])) {
      $ime_atr='';
      while ($poz<strlen($txt) and dozvoljeno_u_oznaci($txt[$poz])) {
    $origstr .= $txt[$poz];
    $ime_atr .= $txt[$poz++];
      }
      $vrednost='';
      if ($txt[$poz]=='=') {
    $origstr .= $txt[$poz];
    $poz++;
    if ($txt[$poz]=='"' or $txt[$poz]=="'") {
      $origstr .= $txt[$poz];
      $vrednost='';
      $kraj=$txt[$poz]; $poz++;
      while ($poz<strlen($txt) and $txt[$poz]!=$kraj) {
        $origstr .= $txt[$poz];
        if ($txt[$poz]=='\\' and $txt[$poz+1]==$kraj) {
          $vrednost .= $kraj;
          $poz++;
          $origstr .= $txt[$poz];
        } else $vrednost .= $txt[$poz];
        $poz++;
      }
    } else {
      $vrednost='';
      while (dozvoljeno_u_oznaci($txt[$poz])) {
        $origstr .= $txt[$poz];
        $vrednost .= $txt[$poz++];
      }
      $poz--;
      $origstr=substr($origstr,0,-1);
    }
      } else {
    $poz--;
    $origstr=substr($origstr,0,-1);
      }
      $atributi[$ime_atr]=$vrednost;
      $origstr .= $txt[$poz];
      $poz++;
    } else {
      $origstr .= $txt[$poz];
      $poz++;
    }
  }
  $atributi['orig_str']=$origstr;
  return array($oznaka,$atributi);
}

function dozvoljeno_u_oznaci($slovo) {
  return ereg("^[-A-Za-z0-9._]$",$slovo);
}

function razmak($slovo) {
  return (($slovo==' ') or ($slovo=="\t") or ($slovo=="\n") or ($slovo=="\r"));
}

function tekst_oznake($oznaka, $sadrzaj, $atributi=array()) {
  global $sve_oznake;

  if (is_array($sve_oznake[$oznaka])) {
    $txt = $sve_oznake[$oznaka][0].$sadrzaj.$sve_oznake[$oznaka][1];
    if (is_array($atributi))
      foreach (($atributi) as $atr => $vrednost) {
    if ($atr != 'orig_str') $txt = str_replace("[$atr]",$vrednost,$txt);
      }
    return $txt;
  } elseif (is_string($sve_oznake[$oznaka])) {
    return $sve_oznake[$oznaka].$sadrzaj;
  } else {
    // ovde ne bi trebalo nikad da stigne, ali za svaki slučaj
    return "[$oznaka]$sadrzaj"."[/$oznaka]";
  }
}

/*

 Jedna oznaka u nizu $stanje je zapravo par koji sadrži ime oznake i
 njene osobine (atribute). Osobine su jedan rečnik u kom su ključevi
 imena osobina, a vrednosti njihove vrednosti. Naročita osobina sa
 imenom "orig_str" sadrži pun tekst same oznake (sve između "[","]").

*/

function obradi_tekst($txt,$stanje=array(),$poz=0,$adresa='',$jezik='en') {
  global $sve_oznake;
  $sadrzaj='';
  while ($poz<strlen($txt)) {
    if ($txt[$poz]=='[') {
      if ($txt[$poz+1]=='/') {
    $poz=$poz+2;
    $zatvaranje='';
    while (dozvoljeno_u_oznaci($txt[$poz]) and $poz<strlen($txt)) {
      $zatvaranje .= $txt[$poz++];
    }
    $ostatak=''; // sve do ']' je nebitno
    while ($txt[$poz] != ']' and $poz<strlen($txt)) $ostatak.=$txt[$poz++];
    $poslednji = array_pop($stanje);
    if ($poslednji and $zatvaranje == $poslednji[0]) {
      return tekst_oznake($zatvaranje,$sadrzaj,$poslednji[1]);
    } else {
      $sadrzaj.="[/$zatvaranje$ostatak]";
      $stanje[]=$poslednji;
    }
      } else {
    $poz=$poz+1;
    list($imeoznake,$argumenti)=obradi_oznaku(&$txt,&$poz);
    $argumenti['trenutno']=$adresa;
    $argumenti['jezik']=$jezik;
    $stanje[]=array($imeoznake,$argumenti);
    $poz++;

    if (is_array($sve_oznake[$imeoznake])) {
      // ovde treba obradi_tekst do zavrsne oznake
      $sadrzaj.=obradi_tekst(&$txt,$stanje,&$poz,$adresa,$jezik);
      array_pop($stanje);

    } elseif (is_string($sve_oznake[$imeoznake])) {
      $sadrzaj.=tekst_oznake($imeoznake,'',$argumenti);
      array_pop($stanje);
      $poz--;
    } else {
      // inace treba pozvati funkciju!!!
      $proba=pozovi_oznaku($txt,&$poz,&$stanje,$imeoznake,$argumenti);
      if ($proba) {
        $sadrzaj.=$proba;
        $poz--;
      } else {
        $sadrzaj .= "[$argumenti[orig_str]]"; $poz--;
      }
      array_pop($stanje);
    }

      }
    } else {
      if (($txt[$poz]=="\n")and (ord($txt[$poz+1])==13)) {
    $sadrzaj.="\n\n<p>";
    $poz++;
      } else {
    $sadrzaj.=htmlspecialchars($txt[$poz]);
      }
    }
    $poz++;
  }

  return $sadrzaj;
}

function pozovi_oznaku($txt,$poz,$stanje,$imeoznake,$argumenti) {
  global $putanja_oznaka;
  $prom="ucitao_oznaku_za_$imeoznake";
  global $$prom;
  $trazifajl="$putanja_oznaka/$imeoznake.php";
  if (! file_exists($trazifajl)) {
    return FALSE;
  } else {
    if ($$prom != 1) {
      include ($trazifajl);
    }
    $fja="obradi_oznaku_$imeoznake";
    $txt=$fja(&$txt,&$poz,&$stanje,$argumenti);
    return $txt;
  } 
}

?>


Par napomena:
— $sve_oznake sadrži rečnik koji „mapira“ oznake (tagove) na ono što ta oznaka treba da ubaci. Ukoliko pokazuje na string, onda se radi o „nezatvorenom“ tagu (nešto tipa SGML SHORTTAG). Ukoliko pokazuje na dvočlani niz, onda se prvi član koristi za početak, a drugi za kraj, i uz to se [ime_atributa] zamenjuje sa vrednošću atributa

— ukoliko oznaka ne postoji u $sve_oznake, onda se njena definicija pokušava naći u fajlu „$putanja_oznaka/$ime_oznake.php“ i to kao f-ja sa imenom „obradi_oznaku_$ime_oznake“ (ako fajl postoji, a ne postoji ovakva funkcija, onda dolazi do sintaksne greške; ako neko zna kako ovo srediti, neka javi)

— osnovna funkcija je „obradi_tekst“ kojoj se prosleđuje ceo tekst koji treba obraditi (poželjno prosleđivati referencu, pošto se taj tekst ne menja), tekuće stanje parsera (pri prvom pozivanju, samo prosledite prazan niz; koristi se kao stek) i pozicija u tekstu. Ona se poziva rekurzivno čim se naiđe na neku oznaku, ali kako se pozicija prosleđuje kao referenca, to se nastavlja posle te oznake (tj. ukupno jedan prolaz kroz ceo tekst)

neki parametri ove funkcije su nepotrebni za sam parser, ali za konkretan posao koji sam radio su mi bili potrebni (jezik, trenutna adresa, itd.) izbacivanjem ovoga, parser će biti samo efikasniji, i trošiće manje memorije

— takođe postoji i naročito procesiranje „praznog reda“ (dva \n\n), kada se ubacuje oznaka za novi pasus — ovo je lako ukloniti prema potrebama

— oznake se sastoje od znakova koji se nalaze u „dozvoljeno_u_oznaci“ funkciji; prema tome, ako želite da proširite, samo izvolite

— jedna oznaka je oblika:
OZNAKA := "[" <KLJUČNA_REČ> ([^<oznaka>]<parametar>) "]"
KLJUČNA_REČ := [<oznaka>]+
<oznaka> je spisak znakova dozvoljenih u oznaci
<parametar> := [<oznaka>]+ "=" <vrednost>
<vrednost> := KLJUČNA_REČ | "'" [^']* "'" | "\"" [^"]* "\""

npr. [link broj=456 ref=pera-14 strana="eto ti ga na" odakle='sta ti "oces" []bre']

završne oznake su samo oblika "[/" <KLJUČNA_REČ> .* "]" (znači npr. „[/link ovo posle nije bitno]“).

Evo i par primera oznaka pomoću funkcija.

Fajl oznake/html.php (ubacuje neprocesirani kod):
Code:
<?php
function obradi_oznaku_html($txt,$poz,$stanje,$argumenti) {
  global $ucitao_oznaku_za_html;
  $ucitao_oznaku_za_html=1;

  $rez='';
  while (substr($txt,$poz,strlen('[/html]')) != '[/html]' and $poz<strlen($txt)) {
    $rez.=$txt[$poz];
    $poz++;
  }
  
  if (substr($txt,$poz,strlen('[/html]')) == '[/html]') $poz+=strlen('[/html]');
  return "$rez";
}
?>


Ovo je vrlo jednostavan primer ubacivanja „neprocesiranog“ koda.

Drugi primer je kada imamo veze na spoljašnje stranice (pa treba dodati „http://“ ako protokol nije definisan); fajl oznake/url.php:
Code:
<?php

function obradi_oznaku_url($txt,$poz,$stanje,$argumenti) {
  global $ucitao_oznaku_za_url;
  $ucitao_oznaku_za_url=1;

  $rez='';
  while (substr($txt,$poz,strlen('[/ url]')) != '[/ url]' and $poz<strlen($txt)) {
    $rez.=$txt[$poz];
    $poz++;
  }
  if (substr($txt,$poz,strlen('[/ url]')) == '[/ url]') $poz+=strlen('[/ url]');

  $rez=obradi_tekst($rez,$stanje,0);

  if (ereg("^[A-Za-z]+:",$argumenti[adresa])) { // znači, već je dat „protokol“
    return "<a href=\"$argumenti[adresa]\">".$rez."</a>";
  } else {
    return "<a href=\"http://$argumenti[adresa]\">".$rez."</a>";
  }
}
?>


I ovo je jednostavno, a pokazuje i kako se ugnježdeni tekst obrađuje po istim pravilima (samo se pozove „obradi_tekst()“). Naravno, ovakva oznaka „url“ se ne može koristiti za unutrašnje relativne linkove, ali to je i namerno (ja uglavnom napravim novu oznaku za unutrašnje linkove koja proverava da li taj link zaista postoji [tome i služe oni parametri „adresa“ i „jezik“ u obradi_tekst()], i na taj način izbegavam pogrešne unutrašnje linkove).

— oznake za tagove kakvi se koriste na ES-u ([oznaka=www.adresa.com]nešto[/oznaka]) se lako mogu napraviti korišćenjem ovih funkcija i atributa „orig_str“.

— ono što bi bilo lako napraviti je prosleđivanje reference na spisak oznaka u obradi_tekst, umesto upotrebe globalnih $sve_oznake. Tada bi bilo moguće definisati strožija pravila (tipa XML-a i SGML-a): npr. u oznaku „para“ se mogu ugnjezditi samo oznake „b“, „i“, „kod“, „url“ i još neke, a ne mogu „listing“, „naslov“, itd.

— Licenca za ovo „čudo“ je GNU GPL :-P

Naravno, sve primedbe su dobrodošle, kao i poboljšanja (kako ne poznajem PHP baš najbolje, ima tu mnogo mesta za njih), itd.

U svakom slučaju, ovo bi trebalo da bude znatno brže od regexp parsiranja koje prolazi po nekoliko puta kroz tekst, ali nisam siguran da je tako. Takođe sadrži i gomilu lepih osobina (bar za mene), pa mislim da je koristan.

Naravno, ako nađete grešku („bug“), dolazim da vas bijem, jer ne želim da se naruši moj ugled sveznajućeg (ko čita PHP forum, zna na šta mislim ;-)

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
Prikačeni fajlovi
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Parser za UBB-oliki kôd07.06.2003. u 14:40 - pre 254 meseci
Trenutni parser na forumu mi pojede [/url] oznake, pa sam dodao razmak, njega naravno ne treba da bude.

Evo i primera upotrebe :

Code:

$putanja_oznaka='/home/danilo/rad/web-delovi/oznake';
require("parser.php");

$tekst = <<<KRAJ
[naslov]Eto ti ga naslov[/naslov]
[linija]
[podnaslov]Prvi podnaslov za [url adresa='elitesecurity.org']ES[/url].[/podnaslov]

[b]Idi [i]kući[/i][/b] i piši mi [email adresa='danilo na kvota.net']emajlom[/email].

KRAJ;

echo obradi_tekst($tekst,array(),0);


A izlaz ovoga je:
Code:
<h1>Eto ti ga naslov</h1>
<hr>
<h2>Prvi podnaslov za <a href="http://elitesecurity.org">ES</a>.</h2>

<em class="bold">Idi <em class="kurziv">kući</em></em> i piši mi <a href="mailto:danilo na kvota.net">emajlom</a>.


dodatak
Morao sam da izbacim ono "www." iz elitesecurity.org kako ne bi ovaj parser ovde dodao "http://" u tekst, pošto sam hteo da pokažem kako se dodaje isto kada protokol nije definisan ;-)
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Parser za UBB-oliki kôd08.06.2003. u 19:46 - pre 254 meseci
Ja i dalje ne shvatam zašto ljudi i dalje koriste taj način formatiranja, kad čovem može da edituje čist dobri, stari HTML u poruci...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Parser za UBB-oliki kôd08.06.2003. u 20:03 - pre 254 meseci
Leko, kompatibilnost, jednostavnost i obezbeđenje.

Usput, ovaj parser gore se može jednostavno iskoristi i za HTML kod izmenama par pojava uglastih zagrada (uostalom, SGML podržava i izmenu znakova za oznake, pa i ovakav kod može biti potpuno validan HTML uz odgovarajuću SGML deklaraciju).

Redom:
1. Kompatibilnost
Postoji ogromna količina ovakvog koda. Naravno, nije problem prebaciti ga jednom u HTML kod, i biti miran, ali nešto od podataka se gubi (pošto ovaj kod nikad nije pravljen kao 1-1).

2. Jednostavnost
Ovakav kod se pravi za „specijalne“ namene, i treba da bude još jednostavniji od HTML-a. Tako, na primer, ako bismo želeli da koristimo HTML 4.01 Strict na stranicama, morali bismo da nateramo sve korisnike da pišu „<em class="bold">" umesto „[b]“. Takođe, HTML nije savršen i neke stvari su loše urađene u njemu (evo, ja sam već izdvojio kao primer razlikovanje unutrašnjih veza i spoljašnjih veza). Opet, HTML je neretko duži od odgovarajućeg koda koji je pravljen samo sa jednim ciljem.

3. Obezbeđenje
Mnogo je teže omogućiti potpuni HTML kod, i osigurati da se u njemu ne radi nešto što ne valja. Uopšte, mislim da bi bio potreban veći deo potpunog SGML parsera da bi se mogao propisno iščistiti od „nedozvoljenih“ znakova.

Znači, problem je što se nema poverenja u onoga koji piše poruku. I tu je lakše rešenje napraviti ograničen skup naredbi, umesto pokušati ograničiti ogroman skup naredbi.

Takođe, čak i ako bi se dopustio HTML kod, to bi morao biti „HTML-oliki“ kod, pošto bi se i on obrađivao kao da nije HTML. A tada je lakše koristiti uglaste zagrade koje upravo naznačuju da se ne radi o HTML kodu.

Usput, niko ne poznaje HTML sintaksu dovoljno dobro da bi i umeo da je uspešno obradi. Tu su ti najbolji primer SGML komentari.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Parser za UBB-oliki kôd10.06.2003. u 01:42 - pre 254 meseci
Danilo, uz sve dužno poštovanje, ničim nisi pokazao da ima smisla koristiti UBB...
Odgovori:

1) Ima nekoliko stotina UBB->HTML parsera (a da ne pričam kako je lako napisati jedan takav...) Bilo kojim od njih se postojeći UBB kod prebaci u HTML i gotova priča. - Još bolje u XML!

2) HTML može biti neverovatno jednostavan! Tebi makar ne treba da dajem primer jednostavnog HTML koda (podsećam, HTML nije samo HTML 4.x, ima i starijih verzija, neke od njih nisu pojma imale za frejmove, embedded skripte, aplete, ...)

3) Sa ovim se apsolutno ne slažem. Validacija TAKO PROSTOG (pogledati stavku 2) HTML koda je trivijala! Jednom se napiše (ili iskoriste postojeće klase) i gotovo...

Na kraju da prokomentarišem ostatak tvoje poruke jednom kratkom rečenicom - podsetiću te da PHP ima ugrađen sistem provere HTML koda i možeš da mi tačno preciziraš koje tagove želiš, ako je ne, plus koje želiš da PHP dodatno "osigura"... Jel tako? Sa mog gledišta, nakon razmatranja MOĆI PHP-a kad je parsiranje i obrada HTML-a (a i XML-a) u pitanju, ja i danje ne vidim razlog da čovek koristi dinosaurus tipa UBB-a, osim ako mu to ne predstavlja neko lično zadovoljstvo.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Parser za UBB-oliki kôd10.06.2003. u 01:45 - pre 254 meseci
Još nešto, ti si gore okačio par stotina linija PHP koda koji obrađuje UBB, dok će neki drugi PHP programer pozvati u pomoć XML parser i isparsirati/validirati uneti HTML/XHTML kod... sve to u ne više od 20 linija čistog PHP koda. Plus, može da bira parsere koji nisu skripte, već ugrađeni u PHP (ili su uključeni kao modul - po želji admina).
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.telia.com

Sajt: dejan.lekic.org


+2 Profil

icon Re: Parser za UBB-oliki kôd10.06.2003. u 01:48 - pre 254 meseci
Da ne bude zabune ... neko će misliti da ja imam nešto protiv UBB-a, ili šta ja znam... Ne, prosto sam jedan od onih ljudi koje je praksa naučila da je vreme jako bitan pojam kad je neki posao u pitanju. Svakako je avantura pisati sopstveni parser i raditi na nekoj stvari od nule... ali poslodavac uglavnom hoće da mu se naručeno dostavi na vreme, a to vreme brzo prolazi.

Nadam se da ste me shvatili. :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Parser za UBB-oliki kôd10.06.2003. u 17:25 - pre 254 meseci
Dejane, u pravu si, međutim, ono što ti navodiš je upravo da ti ne dozvoljavaš HTML, već neki podskup, i tada je validacija laka.

Npr. oznaka „<html lang="sr" id="glavno">“ najverovatnije neće biti prihvaćena, već samo „<html>“, itd. Tj. sve će biti pojednostavljeno, i da bi iskoristio postojeće parsere za XML ili SGML, morao bi da uradiš sledeće:
— napišeš novi DTD ili njegov ekvivalent (valjda XScheme za XML, ili kako se već zove), koji će biti podskup bilo kog izabranog HTML-a (naravno, možeš i koristiti neki od starijih DTD-a za HTML, ali tada će ti trebati i SGML parser, a oni baš i nisu tako lako dostupni)

— naučiš gomilu stvari oko upotrebe jednog XML ili SGML parsera, da bi postigao jednostavne stvari za koje je potrebno par stotina linija koda (parseri sigurno prelaze i 100 hiljada linija koda)


Ako smatraš da su ova dva koraka „jednostavnija“, odlično ;-)

Međutim, i dalje tvrdim da je nebezbedno dozvoliti korisniku da unese čist HTML, osim ako ćeš uraditi ove korake koje sam pomenuo, ili koristiti ručno zidani parser.

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: Parser za UBB-oliki kôd11.06.2003. u 15:52 - pre 254 meseci
Daj Danilo... nadam se da si se salio kad si ovo gore izjavio, a da nisi bio ozbiljan...
Elem uzecu tvoj primer:
Code:

[naslov]Eto ti ga naslov[/naslov]
[linija]
[podnaslov]Prvi podnaslov za [url adresa='elitesecurity.org']ES.[/podnaslov]

[b]Idi [i]kući[/i][/b] i piši mi [email adresa='danilo na kvota.net']emajlom[/email].

Moj stav je da ovaj gore navedeni kod nije nista bolji od adekvatnog HTML koda koji ON SAM PRODUKUJE! HTML kod maltene svako zna, POGOTOVO osnovne tagove... HTML kod moze covek da isparsira, obradi kako mu volja i za to ima dovaljan broj mocnih, ugradjenih PHP funkcija. Tako bar ja smatram. Pisanje DTD-a za nesto ovako prosto nema smisla i ne shvatam zasto si uopste pominjao DTD :)
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Parser za UBB-oliki kôd11.06.2003. u 17:00 - pre 254 meseci
Leko, nisi razumeo suštinu. Ja ne govorim o tome šta je pogodno za korisnika, a onaj moj parser se za najviše pet minuta može izmeniti da prihvata ovakav kod:

Code:

<h1>Eto ti ga naslov</h1>
<hr>
<h2>Prvi podnaslov za <a href='elitesecurity.org'>ES</a>.

<b>Idi <i>kući</i></b> i piši mi <a href='mailto:danilo na kvota.net'>emajlom</a>.


Ipak, takav parser ne bi smeo da prihvati kod kao što je npr.
Code:
<div style="display:hidden">

tj. ovakve stvari koje nisu dopuštene, i koje bi narušile izgled ostalog dela stranice (dodaj tu i pisanje javascript-a, i ostalih gluposti), se moraju ili predvideti (a kako je HTML vrlo obiman, teško je nabrojati sve probleme i njih pojedinačno izbacivati).

Ako želiš za ovaj posao da upotrebiš XML parser (da ti izbaci nedozvoljene <div> oznake, i slično), onda ćeš morati da napišeš DTD ili shemu za to, i da propuštaš svaki tekst kroz takav parser.

Suština je u sledećem:
— ti dozvoljavaš podskup HTML-a, a za to ti treba poseban DTD ako hoćeš neki XML ili SGML parser da koristiš

Znači, tvrdim da je bolje i lakše koristiti poseban parser za tekst koji unosi nepoznati korisnik, a da li će sintaksa biti HTML-olika ili UBB-olika je najmanje bitno.

Da ne bude sve u domenu teorije, za ispod 5 minuta sam parser preradio da radi sa HTML-olikim kodom (ali vodi računa da to nije HTML kod, već samo liči, a to je ono što je bitno), i rezultat posle parsiranja onoga što sam gore naveo je ovo (naravno, lako je izmeniti, ali samo kao primer):
Code:

<h1>Eto ti ga naslov</h1>
<hr>
Prvi podnaslov za <a href="http://elitesecurity.org">ES</a>.

<em class="bold">Idi <em class="kurziv">kući</em></em> i piši mi <a href="mailto:danilo na kvota.net">emajlom</a>.


Praktično sam zamenio svaku pojavu uglastih zagrada sa znakom manje ili veće u stringovima, osim kada se radi o ispisu kada je zamenjeno sa „&lt;“ i „&gt;“. Takođe, izmenio sam i niz na početku $sve_oznake, kako bih dao druga imena (umesto „naslov“ sam stavio „h1“, itd.).
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: Parser za UBB-oliki kôd11.06.2003. u 17:37 - pre 254 meseci
Eto, nisam ni primetio da nisam zatvorio <h2> oznaku, ali parser je to provalio i nije ništa stavio — eto povećanja bezbednosti: umesto da ceo tekst bude u <h2>, ništa neće biti (nisam tvrdio da je parser AI pa da sam zaključi šta treba a šta ne ;-), i sve je u redu.

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

CONFIQ
♫♪♥♪♫

Član broj: 4218
Poruke: 1994
*.inter.net.il.

ICQ: 82327428


+10 Profil

icon Re: Parser za UBB-oliki kôd30.10.2004. u 17:18 - pre 237 meseci
ovo ne radi....

1) Nešto tipa: [link=http://www.google.com/]google[/link] neće da radi sa ovim perserom.... Šta više neće da radi ni sa [link strana=.....
2) [email [email protected]]me[/email] ne radi... Dobija se <a href=mailto:my>me</a>

Anyway znam da tOwk ne posećuje [es] iz ne poznatog razloga tako da ne mogu da ga kritikujem :Đ
 
Odgovor na temu

Ilija Studen
Novi Sad

Član broj: 3864
Poruke: 859
*.dialup.neobee.net.

Sajt: www.activecollab.com


+1 Profil

icon Re: Parser za UBB-oliki kôd30.10.2004. u 21:32 - pre 237 meseci
Ja koristim dvojno resenje (HTML + UBB).

HTML koristim za formatiranje teksta s tim da imam profile koji odredjuju koji se tagovi i atributi mogu koristiti (recimo, trenutno imam dva profila _PUBLIC i _TRUSTED, jedan za komentare i korisnike, drugi za objavljivanje sadrzaja i control panela).

UBB koristim za "blokove". Naime, postoje neke stvari koje su dinamicne i kao takve ih moras prikazati unutar staticnog sadrzaja (npr. najnovije teme sa foruma, listing fajlova iz nekog folder i slicno). Tu koristim UBB. Recimo:

Code:
[documentLink id="97"]Ime dokumenta[/documentLink] kreira link na dokument sa ID 97

[rssEntries uri="http://localhost/mojfeed.rss" showDesc="showDesc" showEntryLen="showEntryLen" /] 
- prikazuje listu unosa odredjenog feeda sa naslovom, 
opisom u TITLE atributu i na kraj dodaje koliko karaktera ima ceo unos.


Za te stvari ne bih mogao koristiti HTML pa sam razvio svoj poseban UBB parser koji ima handlere za neogranicen broj tagova sa neogranicenim i konfigurabilnim brojem atributa (takodje ima i podrsku za profile). Nije tesko za napisati, ali je jako koristan jer pojednostavljuje objavljivanje sadrzaja koji ima dinamicke elemente.

Za najklasicnije formatiranje sadrzaja je ipak najbolji cist HTML.
http://www.activecollab.com - Alat za upravljanje projektima
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.83.beocity.net.

Sajt: localhost


+5 Profil

icon Re: Parser za UBB-oliki kôd30.10.2004. u 23:18 - pre 237 meseci
ilija, a zašto jednostavno nisi koristio neke sgml/xml -like tagove za to? deluje nekako logičnije nego da izmišljaš svoj jezik.. a možeš čak i namespace svoj da definišeš, pa posle to sa XSLom da samo peva (povežeš xsl i php5.. tj xsl parseru dodaš php funkcije.. ludilo ;)

Code:
<documentLink id="97">Ime dokumenta</documentLink> 

ili

<myNS:rssEntries uri="http://localhost/mojfeed.rss" 
showDesc="showDesc" showEntryLen="showEntryLen" />

 
Odgovor na temu

[es] :: PHP :: Parser za UBB-oliki kôd

[ Pregleda: 2902 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.