Tomasz O.

Tomasz O. Linux Engineer, team
lead

Temat: Zamykanie tagów

Zrobiłem taki feature, że gdy user wstawia jakiś tekst typu komentarz albo notka na blogu może dać metataga typu [ i ], [ /i ] który parser wymieni na odpowiednio <i> oraz </i>.
Teraz mam problem, bo jak się okazuje, jeśli się otworzy wiele tagów <i> a zamknie tylko 1 albo w ogóle ich się nie pozamyka, to tagi wpływają na pozostałą część strony.
Znacie jakieś eleganckie rozwiązanie tego problemu inne niż zliczanie otwartych tagów i doklejanie odpowiedniej ilości zamknięć na koniec tekstu? :)Tomasz Oleksa edytował(a) ten post dnia 24.06.09 o godzinie 12:16
Piotr S.

Piotr S. Web Developer / Web
Designer

konto usunięte

Temat: Zamykanie tagów

$text_output = preg_replace('#\[b](.*?)\[/b\]#', <b>\1</b>, $text_input);
Stanisław P.

Stanisław P. Software designer

Temat: Zamykanie tagów

Jeśli cały tekst usera jest objęty <p> </p> i na stronie używasz html, to możesz po prostu </p> zamknąć. To na pewno nie jest eleganckie :)

Elegancko, to możesz przechodzić przez tekst jakąś funkcją, która wywołuje się rekursywnie po każdym otwartym tagu. Czyli:

jest_tag($typ_taga, $pozostały_tekst) {
print "<$typ_taga>";
while (tutaj coś wyszukującego następny tag) {
if ($następny_tag=="/$typ_taga") {
print "<$następny_tag>";
return $nowy_pozostały_tekst;
} else {
$pozostały_tekst = jest_tag($następny_tag, $nowy_pozostały_tekst);
}
}
// jak już nie ma tagów, i funkcja dotarła tutaj, to znaczy, że brakuje końca
print "</$typ_taga>";
return "";
}
Stanisław Pitucha edytował(a) ten post dnia 24.06.09 o godzinie 12:53
Michał Ławicki

Michał Ławicki dostawca zadowolenia

Temat: Zamykanie tagów

możesz też pobawić się narzędziami typu HTML Purifier

konto usunięte

Temat: Zamykanie tagów

Stanisław Pitucha:
jest_tag($typ_taga, $pozostały_tekst) {
print "<$typ_taga>";
(...)
}

off-topic: nie radzę stosować "print", który zwraca dodatkowo true/false. Rezultatem jest wolniejsze działanie skryptu.
Stanisław P.

Stanisław P. Software designer

Temat: Zamykanie tagów

Maciej Duda:

off-topic: nie radzę stosować "print", który zwraca dodatkowo true/false. Rezultatem jest wolniejsze działanie skryptu.

1. Nie radzę stosować print w takim kodzie wogóle - jest_tag powinien tak naprawdę budować stringa. Przykład był dla przykładu.

2. Jeśli masz kod analizujący to co przesłała przeglądarka, czytający sesje z cacha/dysku, kontaktujący się z bazą danych, przetwarzający dane, odsyłający tekst (zwykle skompresowany), to podlicz sobie ile te rzeczy czasu zajmują. A potem sprawdź ile zajmuje jedna instrukcja bytecode'u php typu zwrócenie wartości. Ile ich zmieści się w 1ms - tysiące? milion? W skrócie - to nie ma żadnego znaczenia!

A swoją drogą w tym kodzie można było się do tylu innych rzeczy przyczepić / poprawić...Stanisław Pitucha edytował(a) ten post dnia 24.06.09 o godzinie 16:44

Temat: Zamykanie tagów

Elegancko to jest tak:
Maciej Duda:
$text_output = preg_replace('#\[b](.*?)\[/b\]#', <b>\1</b>, $text_input);

Eleganckim nie nazwę na pewno tego rekurencyjnego potworka ;]
Tomasz O.

Tomasz O. Linux Engineer, team
lead

Temat: Zamykanie tagów

Przyznam, że najbardziej spodobał mi się pomysł podmieniania całości (<i> * </i>), ale dzięki za wszystkie sugestie :)

@Stanisław, próbowałem zamykać teksty w <p>, <div> i kilku innych które przyszły mi do głowy, ale niestety nie chciało to działać.

konto usunięte

Temat: Zamykanie tagów

Piotr S.:
Zerknij tutaj:
http://www.bbcode.org/
http://www.bbcode.org/implementations.php

jeszcze lepsze są formatowania typu TiddlyWiki lub Markdown

Często nie wymagają w ogóle zamykania bloku (w przypadku nagłówków, paragrafów, wyliczeń) a także umożliwiają cięcie tagów HTML (lub ich kodowanie na twardo (">" -> "& gt ;").Piotr Likus edytował(a) ten post dnia 26.06.09 o godzinie 10:03

konto usunięte

Temat: Zamykanie tagów

Piotr Likus:
Często nie wymagają w ogóle zamykania bloku (w przypadku nagłówków, paragrafów, wyliczeń) a także umożliwiają cięcie tagów HTML

Trafna uwaga.
Enter ("\n") zamyka wcześniej otwarty tag.
Z resztą użytkownicy (przeciętni) nie interesują się klepaniem tagów, tylko edytują tekst metodą mark&click korzystając z paska narzędzi.Maciej Duda edytował(a) ten post dnia 26.06.09 o godzinie 11:41

konto usunięte

Temat: Zamykanie tagów

W PECLu jest obsługa bbcode.
http://pecl.php.net/package/bbcode



Wyślij zaproszenie do