Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Mechanizm BB Code
Forum PHP.pl > Forum > PHP
Asmox
Wiem, że już były tematy w stylu: Jak zrobić BBcode, a także jest już wiele poradników na ten temat. Ale nie chodzi mi o to jak go zrobić, ale w jaki sposób się go przerabia. Zastanawiam się, dlaczego zamiast na przykład takiego kodu:
  1. <?php
  2. function bbcode($tekst) {
  3. preg_replace('', '<b>', $tekst);
  4. preg_replace('', '</b>', $tekst);
  5. }
  6. ?>

Jest coś takiego:
  1. <?php
  2. function bbcode($tekst) {
  3. $tekst = preg_replace("#(.*?)#si",'<b>1</b>',$tekst);
  4. }
  5. ?>


Ponieważ jest to dla mnie bardzo dziwny skład tej funkcji, chciałbym się wypytać o następujące oznaczenia (w sensie co one znaczą)
  • # - preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
  • (.*?) - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
  • #si - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
  • \\1 - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
  • \[, \], - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);
ddiceman
Kod
# - preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);

delimiter, wyrazenia regularne PCRE musza byc ograniczone z dwoch stron znakiem specjalnym

Kod
(.*?) - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);

dowolny ciag znakow mogacy wystapic 0 lub wiecej razy

Kod
#si - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);

flagi modyfikujace dzialanie dopasowania:
i - case insensitive (niewrazliwe na wielkosc znakow)
s - kropka pasuje takze to znakow nowej linii etc.

Kod
\\1 - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);

odwolanie do tego, co zostalo przechwycone wczesniej w atomie (.*?)

Kod
\[, \], - $tekst = preg_replace("#\[b\](.*?)\[/b\]#si",'<b>\\1</b>',$tekst);

oznaczenie, ze nawias kwadratowy tutaj to znak a nie operator zakresu znakow
Asmox
Bardzo to wszystko skomplikowane... Nie wystarczyłoby tak jak pisałem wcześniej zamienianie [.b] na <b> i [./b] na </b> questionmark.gif
sowiq
A kto Ci broni zrobić str_replace('[b]', '<b>', $txt)? Do takich prostych przypadków jak najbardziej wystarczy. Do tego będzie działało szybciej i będzie prościej napisane.

Ale problem może się pojawić, jeżeli używasz
Kod
[img]adres_obrazka[/img]
Rozwiązanie z preg_match() jest po prostu bardziej uniwersalne.
.radex
Cytat(Asmox @ 9.02.2009, 19:08:50 ) *
Bardzo to wszystko skomplikowane... Nie wystarczyłoby tak jak pisałem wcześniej zamienianie [.b] na <b> i [./b] na </b> questionmark.gif


Bo jak ktoś zapomni zamknąć taga, to strona się rozwali.
Asmox
Cytat(.radex @ 9.02.2009, 19:16:17 ) *
Bo jak ktoś zapomni zamknąć taga, to strona się rozwali.

OK, już rozumiem. Jutro zrobię testy na swojej stronce i zobaczę czy się będzie rozwalać happy.gif

@EDIT
Dobra nie chce mi się tego sprawdzać biggrin.gif .
Teraz chciałbym zrobić mechanizm nie_bbcode (bo jak edytuję newsa, to znowu są znaczniki HTMLa).
Mam taki kod:
Kod
<?php
function niebbcode($tekst) {
/*linijka 44*/ $tekst = preg_replace("<b>(.*?)</b>","#[b]\\1[/b]#si",$tekst);
/*linijka 45*/ $tekst = preg_replace("<i>(.*?)</i>","#[i]\\1[/i]#si",$tekst);
/*linijka 46*/ $tekst = preg_replace("<u>(.*?)</u>","#[u]\\1[/u]#si",$tekst);
/*linijka 47*/ $tekst = preg_replace("<s>(.*?)</s>","#[s]\\1[/s]#si",$tekst);
return $tekst;
}
?>

I wtedy PHP zwraca mi taki komunikat:
Cytat
Warning: preg_replace() [function.preg-replace]: Unknown modifier '(' in C:\Program Files\WebServ\httpd\Ala kronika\skrypty\filtrinclude.php on line 44

Warning: preg_replace() [function.preg-replace]: Unknown modifier '(' in C:\Program Files\WebServ\httpd\Ala kronika\skrypty\filtrinclude.php on line 45

Warning: preg_replace() [function.preg-replace]: Unknown modifier '(' in C:\Program Files\WebServ\httpd\Ala kronika\skrypty\filtrinclude.php on line 46

Warning: preg_replace() [function.preg-replace]: Unknown modifier '(' in C:\Program Files\WebServ\httpd\Ala kronika\skrypty\filtrinclude.php on line 47


O co mu chodzi??
pyro
nie dales ogranicznikow do regexa smile.gif
sowiq
Dał, ale nie tu, gdzie trzeba smile.gif Zamiast w pierwszym parametrze, to w drugim.
Kod
/*linijka 44*/ $tekst = preg_replace("<b>(.*?)</b>","#[b]\\1[/b]#si",$tekst);
Asmox
Hm... zastanawiam się, co jest lepsze (bo mam problemy z zamianą bbcode na html):
1. Wszystkie znaczniki w niezmienionej postaci [ b ], znaczniki html trzymać w bazie
A kiedy dane są wczytywane na stronie to je filtrować i zamieniać, a znaczniki HTML zostawiać w postaci takiej, że są wyświetlane na stronie.

2. Filtrować dane wysyłane do bazy (znaczy piszę np. [ b ] tekst [ /b ] i w bazie zamieniają się na <b> i </b>)
Wyświetlać na stronie dane prosto z bazy
Przy edycji jeszcze raz zamieniać na [ b ] i [ /b ]

Zastanawiam się nad opcją pierwszą, ale mam pytanie: czy trzymanie danych w bazie nieprzefiltrowanych jest niebezpieczne? (Tak by było w opcji 1).

Hej no co w końcu jest lepsze? Powiedzcie proszę
KiKiDiaVo
sposobów na zamianę jest dużo smile.gif

może się przyda:
http://www.addedbytes.com/cheat-sheets/dow...at-sheet-v2.pdf
Asmox
Pytałem się, który sposób jest lepszy....
koreja
Według mnie to bezpieczniejsza (a zarazem lepsza) byłaby opcja pierwsza.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.