[php] Zamykanie znaczników

0

Witam. Potrzebuję skryptu, w php, który sprawdzi czy w zmiennej ze stringiem są pozamykane wszystkie znaczniki. Czyli jest coś takiego, że jesli są jakieś kawałki tekstu "[img]", to sprawdzi czy są wszystkie zamknięte "[\img]", a jeśli nie, to dopisze ich odpowiednią ilość na końcu. Tak samo ze znacznikami "[b] - [/b]" i kilkoma innymi. Może mi ktoś powiedzieć jak to zrobić?

0

Zliczasz ilość otwarć, a następnie ilość zamknięć. Jeśli któreś się nie zgadzają - dopisujesz.

0

No, ale właśnie nie wiem jak zliczyć ilość tych słów :\

0

przejżyj w manualu funkcje zaczynające się na str i preg

0

ech.. szukarka!
http://4programmers.net/Forum/viewtopic.php?id=86400
miało zostać wprowadzone do Coyote ale jakoś chętnego zbrakło ;)
pozostaje Ci na PHP przerobić, ale to już dasz radę

0

aby zliczyć proponuję zastosować wyrażenia regularne ;-)
zlicz sobie do tablicy a potem sprawdź ile jest znaczników otwarcia i tak samo końcowe.

preg_match_all('#(\[{1,1}.*[^\]]#', $str, $arr1)
preg_match_all('#(\[\/{1,1}.*[^\]]#', $str, $arr2)

pisane z palca więc moze nie działać ;-)

0

Prędzej

preg_match_all('#\[[^\]]+]#', $str, $arr1)
preg_match_all('#\[/[^\]]+]#', $str, $arr2)
0
dragon1985 napisał(a)
preg_match_all('#(\[{1,1}.*[^\]]#', $str, $arr1)
preg_match_all('#(\[\/{1,1}.*[^\]]#', $str, $arr2)

możesz mi wyjaśnić po co używasz zapisu:

  1. {1,1}
  2. [^]]
  3. / (przy RegExp startującego od #)

Abstrahując od tego wątku, to Twój zapis jest równoznaczny z czytelniejszym:

preg_match_all('#(\[.*[^]]#', $str, $arr1)
preg_match_all('#(\[/.*[^]]#', $str, $arr2)
0

Wszystkie te kody kończą się tak, że w tym miejscu gdzie je dam, reszta strony jest wycinana :\

0
oprus napisał(a)

to sprawdzi czy są wszystkie zamknięte "[\img]", a jeśli nie, to dopisze ich odpowiednią ilość na końcu.
lepiej by było, żeby zamykał tam gdzie powinny być zamknięte, a nie na końcu

0

Polecam http://pl2.php.net/manual/en/function.substr-count.php zamiast jakichś dziwnych i zbędnych regexpów...

0
mysz napisał(a)

Polecam http://pl2.php.net/manual/en/function.substr-count.php zamiast jakichś dziwnych i zbędnych regexpów...

możesz mi powiedzieć jak chcesz tutaj użyć tej funkcji ?
chcesz żeby zrobić coś w stylu:

foreach(Array('b', 'u', 'i', 'img') as $tag)
  $str .= str_repeat($cl = '[/' . $tag . ']',
    substr_count('[' . $tag . ']', $str) - substr_count($cl, $str));

??? przede wszystkim to jest mniej uniwersalne i na pewno w ten sposób nie oczyścisz kodu i nie zamkniesz tagów w dobrej kolejności

0

Powyżej była dyskusja odnośnie zliczenia tychże elementów. Zresztą preg_match_all() nie wykorzystasz do czegoś innego - co najwyżej pobierzesz wszystkie wystąpienia znaczników w kolejności ich występowania.
Później i tak trzeba się przeiterować po rezultatach i ręcznie zrobić resztę.

Zamiast tego, łatwiej jest zliczyć występowanie znaczników zamykających i otwierających, i dostawiać na końcu tekstu odpowiednią liczbę znaczników zamykających, jeśli jest potrzeba (czyli mniej więcej taki kawałek kodu jaki napisałeś - Twój nie uwzględnia już zamkniętych znaczników). Może jakiś benchmark szybkości? W sumie jestem ciekaw, ale powinno być to szybsze od regexpów :)

Najprościej by było zaprząc do tego parser XML, gdyby to były znaczniki htmlowe (ja sobie napisałem klasę do filtrowania treści od userów, sprawdza zarówno atrybuty na obecność szkodliwych kodów etc). A skoro nie, to zaprzęganie w to regexpów i prób sztucznej inteligencji (która czasem zawodzi, czego nie jesteś w stanie za każdym razem przewidzieć) jest bezsensowne.

A co do zamykania tagów w dobrej kolejności: jak chcesz to zrobić przy użyciu preg_match_all() ? I czy to nie będzie overkill...

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