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ć?
Zliczasz ilość otwarć, a następnie ilość zamknięć. Jeśli któreś się nie zgadzają - dopisujesz.
No, ale właśnie nie wiem jak zliczyć ilość tych słów :\
przejżyj w manualu funkcje zaczynające się na str i preg
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ę
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ć ;-)
Prędzej
preg_match_all('#\[[^\]]+]#', $str, $arr1)
preg_match_all('#\[/[^\]]+]#', $str, $arr2)
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}
- [^]]
- / (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)
Wszystkie te kody kończą się tak, że w tym miejscu gdzie je dam, reszta strony jest wycinana :\
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
Polecam http://pl2.php.net/manual/en/function.substr-count.php zamiast jakichś dziwnych i zbędnych regexpów...
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
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...