![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Od jakiegoś czasu męczę się z kolorowaniem składni języka html. Na wstępie chciałabym powiedzieć, że wszystkie gotowe rozwiązania, jakie widziałam nie rozwiązują mojego problemu, a jeśli istnieje jakieś, które rozwiązuje z chęcią się zapoznam (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Chciałabym pokolorować kod html w ten sposób, że błędne tagi (na razie jedynie błędnie zamknięte) nie są kolorowane wcale, a wyświetlane jako zwykły tekst. Wyglądać ma to tak:(IMG:http://img299.imageshack.us/img299/2193/syntaxcorrectcv1.jpg) Aktualnie doszłam do wyświetlenia czegoś w tym stylu i kompletnie nie mam pojęcia jak ruszyć dalej i usunąć błędne wyświetlanie atrybutów.(IMG:http://img299.imageshack.us/img299/1243/syntaxincorrectiz4.jpg) Linia odpowiedzialna za kolorowanie wartości atrybutów i przykładowy (inny trochę niż na obrazkach, bo z kolorowaniem samych wartości atryburów i krótszy) kod:
Od razu mówię - tak, wiem, że str_replace mogę wziąć w tablicę i z pewnością tak zrobię. Wiem, że na tagi mogą być zamienione znaki wprowadzone przez użytkownika. Style zamienią się w przyszłości na klasy, ogólnie jest to jedynie zarys i z pewnością będzie poprawiony, tak samo jak będę myśleć nad bardziej efektywnymi sposobami przetwarzania i co ważniejsze bezpieczniejszymi, na dzień dzisiejszy chodzi mi jedynie o wyrażenie regularne. Myślałam jeszcze nad automatycznym domykaniem niezamkniętych znaczników, ale to nie jest rozwiązanie, ku któremu chciałabym się skłaniać, wolałabym, żeby nieprawidłowo sformułowane tagi były traktowane po prostu jako zwykły tekst. Próbowałam sprawdzać, czy ciąg kończy się znacznikiem zamykającym/otwierającym, ale działa to u mnie poprawnie tylko w przypadku jednego atrybutu. Jeśli to możliwe poprosiłabym o naprowadzenie na poprawny tok myślenia z tego względu, że wyrażenia regularne (nad czym ubolewam) nigdy nie były i nie są nadal moją mocną stroną. Z góry dziękuję ^^ Ten post edytował Shili 6.06.2008, 11:38:30 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
Pobaw się funkcją preg_replace_callback" title="Zobacz w manualu PHP" target="_manual:
( [EDIT] Poprawiony kod )
PS. Wiem że te wyrażenia są zabójcze, ale chyba nie da się tego napisać prosto ;] (?: ... ) - To samo co zwykły nawias okrągły, ale wartość nie jest wyciągana do zmiennej $1, $2, itd. (\\/?\\S+) - Może ale nie musi występować ukośnik, a potem co najmniej 1 znak "drukowalny" (nie biały) ("|\').*?\\3 - Cudzysłów albo apostrof, a potem dowolne znaki aż do napotkania cudzysłowu (jeśli na początku był cudzysłów) lub apostrofu (jeśli na początku był apostrof). Po prostu pod \\3 jest to, co zostało dopasowane do trzeciego nawiasu (?!(?:l|g)t;)) - (?! to przewidywanie negatywne. Działa podobnie jak klasa znaków [^...], ale nie "zjada" znaków. Całość oznacza, że w danym miejscu NIE MOŻE wystąpić "lt;" lub "gt;" ("|\')?(.*?)((?(2)\\2|\\s|$))) - (?(condition)if_true|if_false) to tzw. dopasowanie warunkowe. Całość oznacza: Spróbuj dopasować cudzysłów lub apostrof, ale jak się nie uda to nic nie szkodzi. Potem dowolne znaki. A następnie warunek: Jeśli pod 2 nawiasem zostało coś dopasowane, to wstaw tam wartość dopasowania z drugiego nawiasu, a jeżeli nie, to wstaw (\\s|$). Czyli jeśli na początku był cudzysłów, do dopasuj znaki aż do napotkania cudzysłowu. Jeśli na początku był apostrof, to dopasuj aż do napotkania apostrofu. A jeśli na początku nie było nic, to dopasuj aż do napotkania pierwszego białego znaku lub końca tekstu (zależy co wystąpi najpierw ;] ) Ten post edytował Kicok 6.06.2008, 14:35:02 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ok, dzięki za sugestię i poświęcony czas i kod (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Z funkcją jeszcze nie zapoznałam się bliżej, ale pewnie czas już najwyższy (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
@edit Kurcze, dzięki (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Szkoda, że nie mogę Ci postawić plusa drugi raz, bo zdecydowanie wyjaśnienie na niego zasługuje ^^ Ten post edytował Shili 6.06.2008, 14:45:05 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 181 Pomógł: 18 Dołączył: 19.04.2008 Ostrzeżenie: (10%) ![]() ![]() |
A ja bym jednak probowal wrocic i skrocic, sprawdz to: //$tekst = " <img src=\"alt.gif\" alt=\"kwa\"<span alt=\"lala\"></span>"; $tekst="<table border=\"0\" cellpadding=\"1\" cellspacing=\"0\" width=\"100%\" > <tr> <td align=\"center\" valign=\"top\" <table width=\"100%\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\"> <tr></tr>"; $_tmp_preg_search = '/"([^"\<>]*(?:\\.[^"\<>]*)*)"([^<"]*?)(?=[^<]*?>)/'; $_tmp_preg_replace = ' [span style="color:red;font-weight:bold"]"${1}"[/span]${2}'; $tekst = preg_replace( $_tmp_preg_search, $_tmp_preg_replace, $tekst); $tekst = str_replace('<', '<', $tekst); $tekst = str_replace('>', '>', $tekst); $tekst = str_replace('[', '<', $tekst); $tekst = str_replace(']', '>', $tekst); echo $tekst; exit; [/color] [color="#000040"]Sprawdzilem na paru dluzszych zrodlach i chodzi, tyle, ze wiadomo w regexp sa zawsze 2 wyjscia: 1. da sie inaczej, 2. moze nie dzialac w specyficznych okolicznosciach (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Ten post edytował cbagov 6.06.2008, 22:34:02 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 20:43 |