Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najdłuższe dowolne wyrażenie
Forum PHP.pl > Forum > PHP
Orzeszekk
Witam. W wyrazeniach regularnych PERL-a użycie wyrażenia (.*?) we wzorcu powoduje wyszukanie najkrótszego dowolnego wzorca.

Wyrazenie (.*) czy tam (.?) (juz nie pamietam) powoduje wyszukanie najdłuzszego dowolnego wzorca.

Czy jest mozliwosc wyszukania dowolnego najdłuższego wzorca?

potrzebuje tego do parsera ktory wytnie z kodu HTML te znaczniki ktore da sie zamienic na bbcode.

wyrazenie

<span style="color: red">tekst czerwony <span style="font-style: italic">i pochylony</span></span>

nie zamienia sie poprawnie na tekst czerwonyi pochylony

tylko wychodzi tekst czerwony<span style="font-style: italic">.

Cos takiego wychodzi. W kazdym razie powinien skoczyc do najdalszego znacznika span, a on skacze do najkrótszego.
Nie da sie uzyc <b> <i> <u> poniewaz po wlaczeniu contentEditable w mozilli wykonanie polecenia mozilli exec("Bold") powoduje wstawienie do kodu nie <b> a wlasnie <span style="Font-weight: bold">...
mikiz65
Spróbuj użyć funkcji strp_tags. Wycina znaki HTML z teksu o dowolnej wielkości.
Orzeszekk
Nie chodzi o to by sie ich pozbyc (banał) tylko po to by je pozamieniac na BBCode, z prawidłowym zagniezdzaniem jednego taga w drugim
croc
Nie do końca rozumiem. Podaj przykładową sytuację z wynikiem, który chciałbyś uzyskać.
abort
Czekaj, czy ja dobrze rozumiem, że chcesz zamienić wszystkie możliwe do zamiany tagi html na tagi bb? I chcesz to zrobić jednym regexpem? Będzie trochę skomplikowany. Tym bardziej, że <span style="color: red"> zamieniesz do bbcode na "color=red" i /color, dla kursywy będziesz miał style="font-style: italic" i "/i", a dla bolda dostaniesz "Font-weight: bold" i "/b". No a dla podkreślenia zapewne będzie "text-decoration: underline" i "/u". Dość trudne do pożenienia - zacząłem kombinować, i miałem podobne wyniki jak i Ty.

Ale jeśli już planujesz pisać jakąś funkcję, to poczytaj w manualu do PHP o "Pattern modifiers", zapewne zainteresujesz się czymś takim jak (PCRE_UNGREEDY) - to może Ci w dużym stopniu pomóc. W manualu masz o tym napisane: "If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is inverted, that is, by default they are not greedy, but if followed by a question mark they are.".

P.S.
Nie rozumiem, co miałeś na myśli pisząc "dowolny najdłuższy wzorzec". Albo jest najdłuższy (zapewne przy ustawieniu PCRE_GREEDY), albo najkrótszy (przy PCRE_UNGREEDY). Owszem, może być dowolny inny, ale wtedy na pewno ani nie najdłuższy, ani nie najkrószy.
Orzeszekk
Tak przeczytalem w kursie regexp dowolny najdluzszy wzorzec. Okazalo sie ze i tak zeby to zrobic trzeba napisac parser HTML, ew skorzystac z jakiegos gotowego.

bo jak sie wezmie greedy to wtedy z <b>boldtext</b>notboldtext<b>boldtext</b> zrobi zamiast boldtextnotboldtextboldtext
cos takiego: boldtext</b>notboldtext<b>boldtext

dobra to temat mozna zamknac, znajde sobie dobrą klasę parsera html, i na jej podstawie przetlumacze wiadomosc na bbcode.
croc
A ja się zapytam: PO CO? BBCODE zwykle używa się po to, żeby pozwolić na użycie określonych znaczników i zamienia BBCODE na HTML, a nie odwrotnie.
Orzeszekk
Po to ze mam na stronie edytor wizualny ktory pozwala na edycje w trybie wysiwyg. I wypluwa on jako wynik HTML ktory trzeba zamienic na bbcode, to co zostanie objechac html special chars oraz strip tags i zamienic z powrotem na bezpieczny html ktory mozna wyswietlic na stronie.

I po to że jeżeli edytor wizualny zawiedzie aby uzytkownicy mogli włączyc sobie zwykly edytor BBCode. Wtedy rowniez trzeba zamienic HTML trzymany w bazie na bbcode aby umozliwic im edycje. Nie jestem w stanie zrobic ani sciagnac edytora Wysiwyg ktory bedzie działał na kazdej przegladarce wiec musi byc rozwiazanie alternatywne.

Ok, znalazlem klase SimpleHTMLDomParser, zapowiada sie swietnie.

Zastanawiam sie nad dwoma podejsciami do tematu:
Przeskanowac cale drzewo dokumentu (parser tworzy drzewo DOM) i tam gdzie znajde atrybut "color" tworzyc [color] wokol zawartosci znacznika, gdzie znajde np p tworzyc [p], po zrzuceniu zawartosci drzewa do html bedzie to wygladalo np:
<font color="red">blablabla</font>
nastepnie wyciąć tagi strip_tags, a pozniej dla bezpieczenstwa zaaplikowac html special chars,

lub po prostu przejrzec drzewo DOM i znaczniki które nie są <b> <i> <u> itd.. oraz atrybuty ktore nie są color="xxxx" itd itd.

Rozwiazanie pierwsze jest bardziej klopotliwe, drugie pozwalaloby na wklejenie tekstu bezposrednio z innej strony lub z edytora z zachowaniem formatowania, ale jak mi ktos przemyci w jakims znaczniku onload="java script: <tu wstaw jakis destrukcyjny js>" to tez nie bedzie wesoło.
croc
Moim zdaniem bez sensu. Jak masz edytor WYSIWYG to znaczy, że godzisz się na HTML na stronie. Zamiana na BBCODE to rozwiązanie naokoło.
Orzeszekk
chodzi o to ze np jesli klasa parsujaca zle sparsuje html to juz ktos moze mi wkleic jakis złośliwy znacznik, a tak jezeli zamieniam wszystko na bbcode a pozniej wycinam wszystkie znaczniki to jezeli zle zadziala klasa parsujaca to po prostu nie wyswietli sie nic.


No nie wiem czy to takie bez sensu... co mam siąść na tyłku i modlic sie zeby nikt mi nie zrobił XSS przez edytor tekstu? Ten edytor poradnikow musi byc dostepny dla kazdego usera.

Godze sie na html ale tylko ten dotyczący formatowania a nie linkowania skryptów z innych stron i kradzieży cookies.....

Zreszta jak zrobie html special chars to wszystkie znaczniki staną się nieaktywne.

Chyba zrobie tak: przejrze drzewo dokumentu, utworze tagi bbcode tylko z tych znacznikow ktore dotycza formatowania, wkleje do nich tylko te atrybuty ktore sa bezpieczne, usune tagi, zrobie html special tags, zamienie bbcode (zachowam pisownie atrybutów html-owską) na html zamieniajac [ na < i ] na > i raczej nie mam sie czym martwic.
croc
A nie możesz zastosować jakiegoś gotowego edytora WYSIWYG, który sam wkleja BBCODE i nie ma nic wspólnego z HTML? Wtedy zapiszesz wpis bezpośrednio do bazy, a odczytywać będziesz z htmlspecialchars i zamieniając BBCODE na HTML i nic złego nie ma prawa się stać.
Orzeszekk
Fajna rada. Zdam sie w walidacji danych na javascript?

1. Będę za kazdym razem tłumaczył stronę z BBCode na Html?
2. Zapisze wpis bezposrednio do bazy. A co jeżeli ktoś sobie z radosci wstawi ' OR 1=1?
3. Edytor ktory nie ma nic wspolnego z BBCode. A co jak ktos sobie odsłoni pole tekstowe ktore służy do wysłania tekstu z edytora i wklei tam HTML? Wtedy bede mial troche bbcodu i troche htmla. Bez problemu wtedy mozna sobie wstawic <script></script>
4. Edytor nie moze byc gotowy bo klient sobie ubzdurał że mają byc w nim pewne specyficzne tagi a ja nie bede 2 tygodnie dochodził w czyims edytorze co i jak działa zeby moc dodac wlasna opcje. Mialem wlasny edytor pierwotnie dzialajacy w ten sposob - tlumaczyl html na bbcode w momencie wyslania, wtedy po stronie php to walidowalem. Problem w tym ze ciagle byly jakies problemy z tym kodem, i w koncu musialem to zarzucic bo np. dzialalo pod jedna przegladarka a pod druga nie.

Nie wiem czy wiesz ze taki edytor gotowy to ramka IFrame z ukrytym polem text-area i ten iframe przechowuje kod HTML ktory widzisz, i ktory trzeba w momencie wyslania przetlumaczyc na BBCode on sie nie bierze znikąd, więc co za różnica czy zrobie tlumaczenie htmla na bbcode po stronie js czy po stronie php.

http://ha.ckers.org/xss.html
http://hacking-bb.blog.onet.pl/Atak-XSS,2,ID346488352,n

wydaje mi sie ze naprawde bezpieczniej by bylo zamienic to na bbcode na wszelki wypadek a pozniej wykasowac wszystkie tagi html.
croc
1. Tak. Taka jest idea BBCODE.
2. Poczytaj sobie o zabezpieczaniu się przed SQL Injection.
3. Dlatego mówiłem, żebyś wyświetlał potem wynik ZAWSZE z htmlspecialchars.
4. Jak nie będziesz dochodził 2 tygodnie to się będziesz męczył 2 miesiące wink.gif Edytorów WYSIWYG dla JavaScript jest masa.

Chcę Ci tylko uświadomić, że Twoja idea jest dziwna i utrudniasz sobie pracę.
Orzeszekk
Ja wiem o zabezpieczaniu przed SQL injection. Tylko ze w twoim poscie bylo wyrazne polecenie aby zapisac "prosto do bazy danych".

Nie rozumiem dlaczego mam za kazdym razem robic htmlspecialchars po odczytaniu z bazy skoro moge to zrobic podczas zapisu i miec z glowy i nie meczyc niepotrzebnie serwa. jak sie ktos wbije do bazy danych to juz i tak po ptokach, a dopoki nikt sie nie wbije nie ma mozliwosci ominiecia htmlspecialchars przy zapisie.

To twoja idea jest dziwna jak dla mnie - nie zwalidowac danych przy zapisie do bazy tylko robic to za kazdym odczytem a w bazie danych trzymac syf. A co jezeli gdzies sie pomyle i wyswietle niezwalidowany? Miejsc gdzie wyswietlam jest cala masa a miejsc zapisu tylko kilka.

edytor mam juz dawno napisany tylko przenioslem wadliwe parsowanie html na bbcode z javascriptu do php. A poniewaz zagniezdzone tagi (mozilla zapisuje np fontsize i font color jako span) nie tlumacza sie poprawnie regexpem to znalazlem sobie parser php.

Na pewno nie ma takiego edytora wysiwyg jak mi jest potrzebny.

w ogole gadasz dziwne rzeczy - najpierw kazales mi miec html na stronie, teraz nagle bbcode, czy html juz sam nie rozumiem, nie wiem jak chcesz zabezpieczyc strone przed tymi wszystkimi XSSami a jednoczesnie zachowac jakies formatowanie na stronie.. widzisz ile tam jest podpuch i roznych sposobikow zeby przemycic kod html - a biala lista by lepiej dzialala niz czarna.
croc
OK, jeszcze raz. Moja idea jest taka, żeby wszystko co użytkownik ma prawo zapisać w formie sformatowanej było zapisane jako BBCODE w bazie danych. Wszystko inne jest zwykłym tekstem.

Jako zwykły tekst może sobie zapisać znaczniki HTML jeśli próbuje być cwaniaczkiem. Takie próby powinny lądować do bazy danych BEZPOŚREDNIO. Ja zawsze powtarzam, że baza danych to miejsce święte i to co użytkownik wpisze, ma się w niej znaleźć. Dlatego htmlspecialchars PO, a nie PRZED zapisem.

Zabezpieczenie przed SQL Inj. to oczywista sprawa.

Czyli zakładając, że ktoś może np. tylko pogrubiać i pochylać tekst i usiłuje jeszcze go podkreślić, ale na to już nie zezwalasz:

Kod
[b][i]<u>Jestem cfaniak!</u>[/i][/b]

Wymaluje:
<u>Jestem cfaniak!</u>
Orzeszekk
twoja idea do mnie nie trafia, jakos nie uwazam cwaniaczków próbujących włamac sie na strone jako świętych.

To wlasnie ty kombinujesz naokoło zwlekajac z htmlSpecialchars do momentu odczytu. Nie rozumiem z jakiego powodu mam trzymać syf w bazie danych skoro od razu moge zdeaktywowac w nim tagi html

Tylko ze twoja idea nijak sie ma do sytuacji ktora musze rozwiazac - MUSZĘ zrobić WYSIWYG, i nie ma innej opcji, na pewno nie ma opcji na BBCode wpisywane ręcznie.. i w jego przypadku nie ma innej mozliwosci niz przetlumaczenie htmla na bbcode ew. przeczyszczenie htmla ze smieci za czym nie jestem zbytnio.
croc
Cytat(Orzeszekk @ 26.10.2011, 02:19:39 ) *
Nie rozumiem z jakiego powodu mam trzymać syf w bazie danych skoro od razu moge zdeaktywowac w nim tagi html

I tu się nie rozumiemy, więc moja dalsza pomoc w tym temacie nie ma sensu. Może ktoś inny ma inny pomysł.
by_ikar
Jednym wyrażeniem tego nie zrobisz wink.gif możesz to zrobić kilkoma wyrażeniami, bo w preg_replace możesz wstawić tablicę z wyrażeniami: http://php.net/manual/en/function.preg-rep...hp#example-4207 tyle że, wolałbym to zrobić tak jak pisze @croc. Z tym że ja nie użyłbym htmlspecialchars przy wyświetleniu (po co miałbym N razy tą samą operacje wykonywać?), tylko przed dodaniem do bazy.
Orzeszekk
Zrezygnowalem z uzycia wyrazen regularnych na rzecz parsera HTML smile.gif To klasa która z kodu HTML utworzy mi w pamieci drzewo znaczników tak jak jest np window.document w javascript. Przejrze kod tam i wszystko wytne.

Widzial ktos moze np. złośliwy kod XSS ktory by mial w sobie wszystkie mozliwe rodzaje exploitow i ktory mozna sobie wkleic w przegladarke i dzieki temu sprawdzic odpornosc swojej strony? Taki fulltest;d

Dobra, poradziłem sobie. Uzylem klasy simple_html_dom ktora jest w stanie zamienic kod HTML ze stringa na drzewo DOM dokumentu. Następnie tworzę stringa który będzie wynikowym bezpiecznym tekstem. Przeglądam drzewo dokumentu białą listą i jeżeli znajde dozwolony tag to przepisuje go do wynikowego stringa. Atrybuty ktore przepisuje dla kazdego taga rowniez zdefiniowane są białą listą, oraz każdy styl inline style="costam" jest sprawdzany regexpem i przepisywane sa tylko dozwolone atrybuty. Wygląda na to że klasa działa, w razie podania znacznika <script> nic nie jest przepisywane a jak testowalem z jakimis bardziej wyszukanymi XSS-ami to po prostu parser błędnie je odczytuje i wychodzą głupoty w drzewie dokumentu albo nic nie wychodzi co uniemozliwia wklejenie XSS-a. No chyba ze pomylilem sie przy testach. Wątek do zamknięcia ;D
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.