ďťż

[PHP] Wyciąganie tekstu z tagów

       

Podstrony


telcocafe

Witam,

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(' ','&nbsp;&nbsp;',$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

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.