Problem z wyr. regularnymi - wyciąć cały tekst między znacznikami

0

Cześć, mam problem, chcę wyciąć cały tekst między znacznikami, np:
[quote]...[/quote]

lub

[quote=nick]...[/quote]

Posługuję się funkcją:

$res = preg_replace("/\[(.*)\](.*)\[\/(.*)\]/", "", $res);

ale raz działa, a raz nie i nie mogę powiedzieć, dlaczego nie działa.

0

pewnie nie działa jak w tekście jest inny znak "[" lub "]".
Ale moment. preg_replace? Chcesz usunąć wszystko oprócz [][/]? Po co tak?

Twoje wyrażenie powinno być raczej:
preg_match('@\[quote\](.*)\[/quote\]@');
albo
preg_match('@\[quote=([^\]]+)\](.*)\[/quote\]@'); // dla wersji z nickiem

A najlepiej to nie wynajdywać koła od nowa i użyć gotowej biblioteki do bbcode, bo akurat ogarnięcie błędnego/zagnieżdżonego bbcode to pewna sztuka i nie zrobisz tego jednym regexpem, więc chyba szkoda Twojego czasu (nawet w 4programmers czasem coś się psuje przy tutejszych znacznikach (tylko tutaj są html-like)).

0

Może ja powiem o co mi chodzi. Mam na stronie coś takiego jak: ostatnie komentarze. To jest lista ostatnich 10ciu wypowiedzi(ograniczone do 80 znaków). Ale problem jest taki, że niektóre wypowiedzi są cytowane. I wtedy w tej liście widać cytowaną wypowiedź, a nie odpowiedź. I dlatego chcę to usunąć. Razem oczywiście z [] i [/]

0
$komentarz = preg_replace('@\[quote\].*\[/quote\]@', '', $komentarz);
$komentarz = preg_replace('@\[quote=[^\]]+\].*\[/quote\]@', '', $komentarz);
0

To nie będzie działać w 100 % dobrze jak np. cytowany post cytuje inne posty. Ja bym znalazł pozycję wszystkich tagów otwierających i wszystkich zamykających regexem, a następnie odpowiednio te tagi wyciął (np. sortujesz po pozycji obydwu tagów rosnąco i idziesz z licznikiem, otwierający +1, zamykający -1 i za każdym razem gdy licznik wzrośnie od 0 (do 1) zachowujesz pozycję, a gdy spadnie do 0 dodajesz zakres między zachowaną pozycją i pozycją w danej chwili do zakresów do usunięcia).

1

myslalem ze to takie proste. 160 znakow i podwójne quotowanie. no i Twoj magiczny regexp też nie brał tego pod uwagę.

napisz sobie funkcję, którą będziesz wywoływać zapewne rekursywnie,
w funkcji użyjesz preg_match - wyszukiwanie [quote] lub [quote=costam] (masz wyżej regexpy) - wtedy masz +1 do licznika, używając flagi PREG_OFFSET_CAPTURE dostaniesz miejsce w ktorym to wystepuje, piąty parametr preg_match to offset od którego zaczynasz szukanie, więc w ten sposób jakoś sobie już poprzeskakujesz po tych quotach i pozbędziesz się tekstu między nimi jak i ich samych.
szczerze to gotowca mi się nie chce pisać. późno już, a i w dzien by mi sie nie chcialo. mysle ze troche pomyslisz i sobie poradzisz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1