[PHP]HTML -> BBcode

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een probleem met mijn BBcode progsel

korte schets:
ik heb een forum geprogrammeerd (nog steeds beginstage) en nu heb ik BBcode geprogrammeerd voor mijn forum.
Je voert dus je post in met BBcode en die wordt doorgestuurd naar server en in de database herleid naar html codes
voorbeeld:
code:
1
[email]iemand@lol.com[/email]


Maar hoe kan ik van de html code uit de database bij een edit de bbcode laten genereren met het bovenstaande voorbeeld?

Mijn code om naar bbcode te brengen bij de post is:
PHP:
1
2
$text = eregi_replace("\\\[email\\]([^\\\[]*)\\\[/email\\]", "<a href=\"mailto:\\1\">\\1</a>",$text);  
$text = eregi_replace("\\\[email=([^\\\[]*)\\]([^\\\[]*)\\\[/email\\]", "<a href=\"mailto:\\1\">\\2</a>",$text);


Dus mijn vraag is: welke code te gebruiken om de <a href="mailto:iemand@lol.com">iemand@lol.com</a> naar
code:
1
2
3
[email]iemand@lol.com[/email]
of
[email=iemand@lol.com][/email]

te herleiden?

edit:

Sorry voor de layout vern**king

[ Voor 11% gewijzigd door Verwijderd op 31-05-2003 23:10 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ehm, dat kan je toch op (ongeveer) precies dezelfde manier doen?
er zit immers een patroon in ;)

Acties:
  • 0 Henk 'm!

  • Tranq
  • Registratie: Oktober 1999
  • Laatst online: 16-10-2024
Wanneer zou je dit terug willen herleiden? Als je bedoeld voor edit... de [email] [/email] tags staan toch opgeslagen in de database?

Acties:
  • 0 Henk 'm!

  • dArtagnan
  • Registratie: Mei 2002
  • Laatst online: 23-08 22:47

dArtagnan

Een voor allen, allen voor een

PHP:
1
eregi_replace('(<a [^<]*href=["|\']?([^ "\']*)["|\']?[^>]*>([^<]*)</a>)','[email]\\2[/email]', $tekst);

Acties:
  • 0 Henk 'm!

Verwijderd

zoals tranq al zei... sla geen html code op in je database, maar juist de text met de bb code...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

je geparsede html is nooit meer precies te herleiden naar de originele UBB code; dit wordt nog erger wanneer je bijvoorbeeld geneste [ quote ] tags gaat parsen of [ code ] tags.
Sla dus altijd op z'n minst de niet geparsede text op, en als het je om performance gaat daarnaast de geparsede text; dat scheelt je een hoop kopzorgen :)

maar goed, dit zou aardig moeten werken:
PHP:
1
$text = preg_replace('/<a href="mailto:\/\/(.*?)">(.*?)<\/a>/i', '[email=$1]$2[/email]', $text);

(de PCRE syntax is wat dat betreft wat uitgebreider dan de POSIX syntax :) )

[ Voor 27% gewijzigd door crisp op 01-06-2003 01:11 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Tranq schreef op 01 June 2003 @ 00:07:
Wanneer zou je dit terug willen herleiden? Als je bedoeld voor edit... de [email] [/email] tags staan toch opgeslagen in de database?
mja, misschien om een oud systeem te migreren naar een nieuwe ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

crisp schreef op 01 juni 2003 @ 01:06:
PHP:
1
2
$text = preg_replace('/<a href="mailto:\/\/(.*?)">(.*?)<\/a>/i', 
'[email=$1]$2[/email]', $text);

(de PCRE syntax is wat dat betreft wat uitgebreider dan de POSIX syntax :) )
Als je het dan zo doet:
PHP:
1
2
$text = preg_replace('/<a href="mailto:(.*?)">\1<\/a>/i', 
'[email=$1]$2[/email]', $text);

Weet je ook nog es zeker dat hetzelfde emailadres twee keer getest wordt. Als dat niet gewenst is kan je uiteraard juist weer de (.*?) nemen.

Btw, waarom de / na mailto:, dat hoort/mag niet toch :?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 01 June 2003 @ 11:35:
[...]

Als je het dan zo doet:
PHP:
1
2
$text = preg_replace('/<a href="mailto:(.*?)">\1<\/a>/i', 
'[email=$1]$2[/email]', $text);

Weet je ook nog es zeker dat hetzelfde emailadres twee keer getest wordt. Als dat niet gewenst is kan je uiteraard juist weer de (.*?) nemen.

Btw, waarom de / na mailto:, dat hoort/mag niet toch :?
dan heb je ook geen $2 meer ;)
(en die dubbel slash was inderdaad een foutje, dat krijg je als je alles maar zo neertypt zonder te testen)

maar ik denk dat $2 wel degelijk af kan wijken van $1; als ze hetzelfde zijn, zou je 'm om moeten zetten naar [email]$1[/email]
ergo:
PHP:
1
2
3
4
$text = preg_replace('/<a href="mailto:(.*?)">\1<\/a>/i', 
'[email]$1[/email]', $text);
$text = preg_replace('/<a href="mailto:(.*?)">(.*?)<\/a>/i', 
'[email=$1]$2[/email]', $text);

(in deze volgorde ook, anders gaat het mis)

[ Voor 19% gewijzigd door crisp op 01-06-2003 12:07 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

ik weet niet of dit uitmaakt maar je kan het toch ook zo doen?:
PHP:
1
2
3
4
<?php
 $message = str_replace("[email]", "<a href="mailto:", "$message");
 $message = str_replace("[/email]", "></a>", "$message");
?>

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Verwijderd schreef op 01 June 2003 @ 12:26:
ik weet niet of dit uitmaakt maar je kan het toch ook zo doen?:
PHP:
1
2
3
4
<?php
 $message = str_replace("[email]", "<a href="mailto:", "$message");
 $message = str_replace("[/email]", "></a>", "$message");
?>
dat is verkeerd om ;)
(en deze kan ook geen [email=crisp[at]xs4all.nl]crisp[/email] aan, plus je krijgt nare verschijnselen als er een [/email] ontbreekt)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op 01 juni 2003 @ 12:26:
ik weet niet of dit uitmaakt maar je kan het toch ook zo doen?:
PHP:
1
2
3
4
<?php
 $message = str_replace("[email]", "<a href="mailto:", "$message");
 $message = str_replace("[/email]", "></a>", "$message");
?>
nee dat kan zo niet ;)
edit:
trouwens je overschijft $message ;)

dus dan krijg je <a href="mailto:email@domein.tld><a href="mailto:email@domein.tld</a>

[ Voor 29% gewijzigd door Erkens op 01-06-2003 12:31 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Erkens schreef op 01 June 2003 @ 12:30:
[...]

nee dat kan zo niet ;)
edit:
trouwens je overschijft $message ;)

dus dan krijg je <a href="mailto:email@domein.tld><a href="mailto:email@domein.tld</a>
nee hoor, je krijgt een parse error ;)

enfin, voor de volledigheid even de PCRE versie:

PHP:
1
2
$text = preg_replace('/\\[email\](.*?)\\[\/email\]/i', '<a href="mailto:$1">$1</a>', $text);
$text = preg_replace('/\[email=(.*?)\](.*?)\\[\/email\]/i', '<a href="mailto:$1">$2</a>', $text);

[ Voor 48% gewijzigd door crisp op 01-06-2003 12:40 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

crisp schreef op 01 juni 2003 @ 12:37:
[...]

nee hoor, je krijgt een parse error ;)
* Erkens ziet nu ook dat er een unescaped " in staat :D

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Eigenlijk moet je ipv die (.*?) zoiets doen:
[a-z0-9_-@.]*
of nog beter, hoewel er een paar adressen mee uitgesloten worden, ik geloof dat de % ook in een gebruikersnaam mag zitten:
([a-z0-9_-]+@[a-z0-9_-]+(:?\.[a-z0-9]+)+)

Jouw voorbeeld zou erg leuke resultaten geven op:
[email=javascript:alert('dus')]klik[/email]

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 01 June 2003 @ 12:45:
Eigenlijk moet je ipv die (.*?) zoiets doen:
[a-z0-9_-@.]*
of nog beter, hoewel er een paar adressen mee uitgesloten worden, ik geloof dat de % ook in een gebruikersnaam mag zitten:
([a-z0-9_-]+@[a-z0-9_-]+(:?\.[a-z0-9]+)+)

Jouw voorbeeld zou erg leuke resultaten geven op:
[email=javascript:alert('dus')]klik[/email]
code:
1
<a href="mailto:javascript:alert('dus')">klik</a>

gek email adres ja, maar outlook plaatst wel netjes javascript:alert('dus') in het to: veld ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

mja, met die mailto ervoor zou het nog goed kunnen gaan, hoewel een spatie tussen mailto: en javascript nog roet in het eten zou kunnen gooien.

klik es testen :)

Maar er domweg van uitgaan dat het wel goed gaat, is niet zo handig.
Better save than sorry, zeggen ze dan hier in Nederland. ;)

Ok, zo dan: " onclick="javascript:alert('dus')

:)

[ Voor 13% gewijzigd door ACM op 01-06-2003 13:03 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ACM schreef op 01 juni 2003 @ 13:01:
mja, met die mailto ervoor zou het nog goed kunnen gaan, hoewel een spatie tussen mailto: en javascript nog roet in het eten zou kunnen gooien.

<a href="mailto: javascript:alert('dus')">klik</a> es testen :)

Maar er domweg van uitgaan dat het wel goed gaat, is niet zo handig.
Better save than sorry, zeggen ze dan hier in Nederland. ;)
mozilla maakt daar:
code:
1
'dus' <javascript:alert>

van in het To: field :+

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

erkens: ik was nog niet klaar met testen :P

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ACM schreef op 01 June 2003 @ 13:07:
Erkens: ik was nog niet klaar met testen :P
moet je op "bekijk bericht" drukken :+
maar nu geeft tie idd eerst een popup en dan een compose mail window zonder adres

[ Voor 5% gewijzigd door Erkens op 01-06-2003 13:09 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

ik doe niet aan bekijk bericht ;)
En ook niet aan hoofdletters :+

Magoed, zoals al gezegd als je zoiets niet checked is de kans groot dat gebruikers html/javascript kunnen toevoegen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 01 June 2003 @ 13:01:
mja, met die mailto ervoor zou het nog goed kunnen gaan, hoewel een spatie tussen mailto: en javascript nog roet in het eten zou kunnen gooien.

<a href="mailto:" onclick="javascript:alert('dus')">klik</a> es testen :)

Maar er domweg van uitgaan dat het wel goed gaat, is niet zo handig.
Better save than sorry, zeggen ze dan hier in Nederland. ;)

Ok, zo dan: " onclick="javascript:alert('dus')

:)
code:
1
<a href="mailto:&quot; onclick=&quot;javascript:alert('dus')">&quot; onclick=&quot;javascript:alert('dus')</a>

tsja, htmlentities() is ook zo gek nog niet ;)

[ Voor 22% gewijzigd door crisp op 01-06-2003 13:21 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

crisp schreef op 01 juni 2003 @ 12:30:
[...]

dat is verkeerd om ;)
(en deze kan ook geen [email=crisp[at]xs4all.nl]crisp[/email] aan, plus je krijgt nare verschijnselen als er een [/email] ontbreekt)
o oke ik doe het hetzelfde als een ubbcode van bv [b]text[/b]
;)

ik had dit nog nooit geprobeerd eigenlijk ik vond het gewoon logische...

en dat ik het overright dat is toch niet zo want als ik =. zo doen zou het bericht dubbel komen zo niet ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dan gaan we unicode er tegen aan gooien ofzo. Magoed, ook de htmlentities gooide je er niet overheen in je voorbeeld ;)

Punt blijft gewoon dat je zo vroeg mogelijk zoveel mogelijk van de foute input moet afvangen, niet pas aan het eind als het uitgespuugd wordt :)

Acties:
  • 0 Henk 'm!

Verwijderd

ik denk dat ik wel begrijp wat je bedoelt :> 8)7

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 01 June 2003 @ 13:44:
Dan gaan we unicode er tegen aan gooien ofzo. Magoed, ook de htmlentities gooide je er niet overheen in je voorbeeld ;)

Punt blijft gewoon dat je zo vroeg mogelijk zoveel mogelijk van de foute input moet afvangen, niet pas aan het eind als het uitgespuugd wordt :)
ben ik helemaal met je eens; in mijn gastenboek heb ik zoiets:

PHP:
1
2
3
4
5
6
7
8
9
$content = htmlspecialchars($content);

// replace ampersands not used in entities
$content = preg_replace('/&amp;amp;(#\d+|[a-z]+|#x[\da-f]+);/is', '&$1;', $content);

$content = nl2br($content);

$content = preg_replace('/\\[mail\]([\w.?&;#~=%\/-]+)@([\w.-]+)\\[\/mail\]/i', '<a href="mailto:$1&#x40;$2">$1&#x40;$2</a>', $content);
$content = preg_replace('/\\[mail=([\w.?&;#~=%\/-]+)@([\w.-]+)\](.*?)\\[\/mail\]/i', '<a href="mailto:$1&#x40;$2">$3</a>', $content);


maar daar sleutel ik nog dagelijks aan :)

[ Voor 13% gewijzigd door crisp op 01-06-2003 22:47 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Toch bedankt voor alle replies, ik ga er zoveel mogelijk van uitproberen en testen met verschillende mail adressen etc :)

ik kan inderdaad de bbcode in mijn dbase opslaan en enkel naar de html 'vertalen' bij het lezen van de forums en niet met de html opslaan in de dbase

[ Voor 39% gewijzigd door Verwijderd op 01-06-2003 16:19 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op 01 June 2003 @ 16:17:
Toch bedankt voor alle replies, ik ga er zoveel mogelijk van uitproberen en testen met verschillende mail adressen etc :)

ik kan inderdaad de bbcode in mijn dbase opslaan en enkel naar de html 'vertalen' bij het lezen van de forums en niet met de html opslaan in de dbase
of je saved ze beide in je database ;)
ligt er maar aan of je meer waarde hecht aan performance of aan opslagruimte

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu de bbcode in een bestand bbcode.php gestopt en de bbcode zelf wordt opgeslagen in de oorspronkelijke vorm dat je intypt in het post venster. Dus dat wordt zo opgeslagen en in iedere while lmoop wordt het bestand bbcode.php aangeropen zodat er iedere keer 'vertaald' wordt naar html
Pagina: 1