ďťż
Podstrony
|
telcocafeWitam,mam skrypt bloga, który (przy dodawaniu notki) wpisuje jej treść i tytuł wraz z innymi danymi do bazy. Chciałem jednak dodać możliwość używania tagów - tak jak na tym forum. Przykład: wpisuję w treści notki: <b>jakiś tam pogrubiony tekst</b>, a tutaj kod: {kod} <br>kod<br><b>nie ma pogrubienia</b> {/kod} i chciałbym, żeby to co jest między {kod} a {/kod} było w jakiś sposób filtrowane (np przez htmlspecialchars, co uniemożliwi wykonanie kodu, tylko go ładnie wyświetli) mam nadzieję, że zrozumieliście :) proszę o pomoc, nie wiem jakiej funkcji użyć aby wyciągnąć tekst znajdujący się między {kod} a {/kod} pozdrawiam preg_match_all( '#\{kod\}(.*?)\{/kod\}#', $tresc_postu, $kod ); echo '<pre>'; print_r( $kod ); Użytkownik Bełdzio edytował ten post 08 sierpień 2007, 21:45 Dzięki, trochę sobie poszukałem o tej funkcji preg_match_all() i muszę przyznać, że skomplikowane to :) A więc mam taki kod: <? $text = "jakis kod !<b>pogrubiony tekst</b><br>[.code]<b>zwykly tekst</b>[./code]<br>cos tam[.code]i znow kod ![./code]koniec wpisu !"; preg_match_all('#\[.code\](.*?)\[./code\]#',$ text,$res); ?> <textarea cols=50 rows=20> <? echo print_r($res); echo "\n ------------------------------- \n"; ?> </textarea> to mi wyswietli: [...]( [0] => <b>zwykly tekst</b> [1] => i znow kod ! ) [...] czyli będę miał ładnie w tablicy to, co zostało umieszczone w tagach [.code][./code] jednak, reszta tekstu (miedzy tymi tagami) się zapodziała ! To co chciałem zrobić, to modyfikować tekst z tagów. W praktyce mogę to zrobić mniej więcej w ten sposób: $tmp = $res[0][1]; $tmp2 = "<br>kod:<br>".htmlspecialchars($tmp)."<br>koniec kodu<br>"; // teraz musze zamienic pierwotny tekst ($text) tak, aby zmodyfikowane byly tagi code $text = str_replace("[.code]$tmp[./code]",$tmp2,$text); (dałem tag z kropką, żeby mi sie post nie wysypał :D) musisz przyznać, że to będzie wyglądało nieprofesjonalnie (str_replace itd). nie ma łatwiejszego sposobu? np wyciągnąc funkcją preg_match_all dodatkowo tekst nieotagowany (tylko musiałby być wyciągnięty tak, żebym wiedział gdzie zostały wstawione tagi) ? ufff... pozdro Użytkownik tsukuyomi_reload edytował ten post 11 sierpień 2007, 19:32 W takim razie użyj takiego wyrażenia: #(.*?)\[.code\](.*?)\[./code\](.*?)# Dzisiaj się trochę uczyłem funkcji regularnych pascala więc wiem coś niecoś :P ok, print_r zwraca coś takiego: [...] [1] => Array ( [0] => jakis kod !<b>pogrubiony tekst</b><br> [1] => <br>cos tam ) [2] => Array ( [0] => <b>zwykly tekst</b> [1] => i znow kod ! ) [...] Z tego można skleić prawie cały początkowy tekst, jednak obcina to, co było po ostatnim tagu [./code], czyli "koniec wpisu" Dla przypomnienia początkowy tekst to: jakis kod !<b>pogrubiony tekst</b><br>[.code]<b>zwykly tekst</b>[./code]<br>cos tam[.code]i znow kod ![./code]koniec wpisu ! Dzięki za wypowiedź, pozdrawiam Użytkownik tsukuyomi_reload edytował ten post 11 sierpień 2007, 20:30 $res = preg_replace( '#\[.code\](.*?)\[./code\]#si', htmlspecialchars('\1'), $text);Ten kodzik powinien podziałać :) Ale głowy nie daję :P $res = preg_replace( '#\[.code\](.*?)\[./code\]#si', htmlspecialchars('\1'), $text);Ten kodzik powinien podziałać :) Ale głowy nie daję :P @edit: nie zauwazylem ze to jest bez _all :D sekundka zaraz sprawdze @edit2: jednak nie działa, tam gdzie jest "zwykły tekst" jest i tak pogrubiony, tak jakby htmlspecialchars nie zadzialalo // i do tego echuje tagi, zamiast je wywalic... @edit3: chodziło mi, że echuje tagi [.code] i [./code] :) Użytkownik tsukuyomi_reload edytował ten post 12 sierpień 2007, 09:57 Na pewno usunąłeś kropki? Ponieważ w [.code] i [./code] nie mogą mieć miejsca. To punkt Twojego wyjścia i nie zmieniałem tego . . . Aha,i jeżeli nie zauważyłeś jakiej funkcji użyłem to sprawdź też,czy zmienną używasz tą samą przy używaniu funkcji. //edit Ach,czyli działa! To Ty chciałeś je wywalić? Użyj striptags czy jaka to była funkcja (skleroza) i powinno działać . . . Użytkownik andrzej_aa edytował ten post 11 sierpień 2007, 22:09 Proponuje zamiast htmlspecialchars() która zamienia znaki html na encje użyć strip_tags($tekst, '<b><i><u><a>') . strip_tags() po przecinku są podawane tagi, których w/w funkcja nie usuwa. Użytkownik statjacek edytował ten post 12 sierpień 2007, 06:19 Na pewno usunąłeś kropki? Ponieważ w [.code] i [./code] nie mogą mieć miejsca. To punkt Twojego wyjścia i nie zmieniałem tego . . . Aha,i jeżeli nie zauważyłeś jakiej funkcji użyłem to sprawdź też,czy zmienną używasz tą samą przy używaniu funkcji. //edit Ach,czyli działa! To Ty chciałeś je wywalić? Użyj striptags czy jaka to była funkcja (skleroza) i powinno działać . . . chodziło mi o to, że echowało tagi [.code] i [./code], ale sobie z tym poradziłem (nie chciałem kopiować kodu ctrl+c i ctrl+v bo bym się niczego nie nauczył, ale przez to coś źle wyszło) Proponuje zamiast htmlspecialchars() która zamienia znaki html na encje [...] tak, właśnie o to mi chodzi - żeby zamienić znaki html na encje Inaczej mówiąc, skrypt po dostaniu czegos takiego: <b>tekst</b> powinien ten tekst pogrubić, ale po dostaniu czegos takiego [.code]<b>tekst</b>[./code] ma wyświetlić <b>tekst</b> czyli niepogrubiony tekst z pokazanymi tagami htmla pozdro i dzięki za zaangażowanie ! Więc spróbuj tak:$res = preg_replace('#(.*?)\[.code\](.*?)\[./code\] (.*?)#si', '\1'.htmlspecialchars('\2').'\3', $text);Kod może nie jest zbyt optymalny,ale powinien działać. Nie wiem czemu poprzedni nie chce działać . . . A ja chyba wiem ;] Zrobiłem sobie funkcję sprawdz() function sprawdz($tmp) { echo "<br>tmp:<br><b>$tmp</b><br>-<br>"; return $tmp; } Która echuje przekazaną do tej funkcji zmienną ($tmp). Odpaliłem Twój kodzik: $res = preg_replace('#(.*?)\[code\](.*?)\[/code\] (.*?)#si', '\1'.sprawdz('\2').'\3', $text); pojawia się tmp: \2 - czyli funkcja dostaje zły parametr, bo \2 nie jest zamieniane stringiem. Nie wiem tylko jak to naprawić... Użytkownik tsukuyomi_reload edytował ten post 12 sierpień 2007, 15:34 Jest! Udało mi się :P preg_replace('#\[code\](.*?)\[\/code\]#sie' , "htmlspecialchars('\\1')", $text;Spędziłem pół godziny nad tym,ale przerzuciłem manual,napociłem się i wyszło :D Działa,ponieważ sprawdziłem :) Tak!! To jest to :) Wielkie dzięki, andrzej_aa. Pozostał jeszcze jeden mały problemik ;] wciskam do bazy coś takiego [.code]" ' : \ / ? < >; [] {} | @ # $ % ^ & * () ~ `[./code] (bez kropek w tagu code;] ) tak dla testu skryptu, czy przejdzie wszyściutko i zostanie zachowane. skrypt odpowiedzialny za filtrację zmiennej wygląda tak: function make_tag($tmp) { $tmp = htmlspecialchars($tmp); return "<div class='code'>".$tmp."</div>"; } function change_text($text) { $text = preg_replace('#\[code\](.*?)\[\/code\]#sie' , "make_tag('\\1')", $text); $text = nl2br($text); $text = str_replace(' ',' ',$text); return $text; } $to_bedzie_wpisane_do_bazy = pg_escape_string(stripslashes(change_text($_POST["text"]))) ; i, o dziwo, że mam wyłączone magic quotes, dostaje coś takiego: \" ' : \ / ? < >; [] {} | @ # $ % ^ & * () ~ ` jak dam stripslashes, to znowóż nie przechodzi znak \ >.< PS. dodam jeszcze, że używam pg_escape_string, gdyż bez tego otrzymuję Something is wrong in your syntax obok 'code'>\" ' : \ / ? < >; [] {} | @ # $ % ^ & * ()' w linii 1 |
|||
Sitedesign by AltusUmbrae. |