Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [PHP] Speciale karakters onderscheiden van HTML-code (https://forum.scholieren.com/showthread.php?t=659339)

Enlightenment 12-11-2003 13:23

[PHP] Speciale karakters onderscheiden van HTML-code
 
Hoi iedereen,

Ik loop tegen een probleem aan voor mijn website-software draaiend op fluffles.net. Deze stelt gebruikers met de juiste userlevel om berichten te plaatsen. Hierbij kunnen dus ook speciale karakters gebruikt worden, zoals het euroteken (€). Hierdoor valideert mijn webpagina echter niet meer met de XHTML-specificatie. Ik wil dus dat al deze karakters omgezet worden naar HTML-code. In het geval van het euro-teken dus €.

Nu kan dat, met de functies htmlentities() en htmlspecialchars().

Het probleem is, dat indien ik deze functies gebruik om het ingevoerde bericht te parsen, de HTML-code meegenomen wordt en ik dus geen HTML kan gebruiken in m'n posts. Dit is niet de bedoeling, en dus bedacht ik het volgende:

Als nou eerst het ingevoerde bericht door een HTML-filter heengaat, blijft de tekst over die niet bestaat uit HTML-code zoals <b>. Dan kan ik htmlentities gebruiken en is het resultaat dus HTML code + de HTML specialchars.

Volg je het nog? Ik wil dus HTML-code gebruiken maar ook < en > kunnen blijven tikken als onderdeel van m'n bericht. Met htmlentities en htmlspecialchars kan dat niet.

Weten jullie een manier hoe dit wel kan?

eddie 12-11-2003 13:29

http://nl2.php.net/manual/en/function.strip-tags.php ?

deathz0rz 12-11-2003 15:14

ik zou een UBB-parser maken/kopieren

edit:

optie 2: schrijf een regexp die HTML tags matcht. moet je wel even de karakteristieken van een HTML tag bedenken. bijvoorbeeld:
1 geen < of > tussen de < en >
2 een letter na de <
3 een afsluit tag (met backreferences)

zoiets

Manuzhai 12-11-2003 17:12

Volgens mij is de manier van deathz0rz de enige zoals jij die bedoelt. Dan moet je dus alle tags parsen (ik zou er daarbij vanuit gaan dat je zelf zorgt voor well-formed XML), en daar tussenin alle special chars parsen. Zelf vind ik dit echter een nogal lelijke oplossing.

Ik zou dus een andere oplossing gebruiken. In principe hoef je tenslotte in XHTML alleen <, > en & te escapen. Dan heb je nog een probleem met het euro-teken, maar om dat op te lossen kun je je charset op ISO-8859-15 zetten in plaats van -1. Daarmee heb je de Latin-1 set + het euro-teken. Dan heb je nog een paar chars over die je moet encoden, en als je er daar veel van hebt (bijvoorbeeld in een HTML tut) zou ik ze in een ander blok (zoals hier [code]) zetten waarbinnen je wel alles encode. Dat is goed te doen. Voor het fixen van de & heb ik wel een functie die je wellicht handig vindt (op deze manier gepost omdat de UBB-parser van vBB dikke stront door een trechter zuigt: parsed smilies in [php], en encodeert < en > niet).

Een leuke manier om een min of meer statische site te onderhouden is overigens met XML, XSLT en Ant. Als je daar meer info over wil hebben moet je het zeggen. :)

Enlightenment 12-11-2003 18:57

Maar ik wil wel HTML in m'n messages kunnen gebruiken, dus gewoon de < en > converten is geen optie.

Wat deathz0rz zegt is idd een optie, maar kan het niet anders?

Een UBB-style parser heb ik al, alleen wil ik dus ook de html special chars encoden naar &amp;lt; enzo.

Manuzhai 12-11-2003 20:22

Ik bedoel dan ook dat je als je daadwerkelijk een < of > wil laten zien gewoon &lt; of &gt; moet gebruiken. Dan ben je van het gezeik af, en zo moeilijk is dat niet (tenzij je uitgebreide zichtbare snippets HTML wil gaan laten zien, maar dan zou je die in een speciale div kunnen zetten waarin ze wel geconverteerd worden).

deathz0rz 12-11-2003 20:37

misschien kan je als je html typt << gebruiken en die dan tijdelijk replacen. ofzo.

Enlightenment 12-11-2003 23:59

Citaat:

Manuzhai schreef op 12-11-2003 @ 21:22:
Ik bedoel dan ook dat je als je daadwerkelijk een < of > wil laten zien gewoon &amp;lt; of &amp;gt; moet gebruiken.
Tip: gebruik &amp;amp;lt;, nu zie je namelijk ook daadwerkelijk een < en >.

Maar dit kan ja, maar dan moet ik dus al html'ed code gebruiken. Elke keer &amp;euro; typen enzo. Ik zou zo graag willen dat dit automatisch gebeurt.
Citaat:

deathz0rz schreef op 12-11-2003 @ 21:37:
misschien kan je als je html typt << gebruiken en die dan tijdelijk replacen. ofzo.
Nou bij HTML lijkt me dat niet handig, maar ik kan idd een parser maken die << en >> met een respectievelijk &amp;lt; en &amp;gt; vervangt.

Een ander idee is om HTML-code binnen de tags te houden. Binnen die tags wordt < en > dan dus niet geparsed naar &amp;lt; en &amp;gt;.

Manuzhai 13-11-2003 03:27

Citaat:

Enlightenment schreef op 13-11-2003 @ 00:59:
Tip: gebruik &amp;amp;lt;, nu zie je namelijk ook daadwerkelijk een < en >.

Maar dit kan ja, maar dan moet ik dus al html'ed code gebruiken. Elke keer &amp;euro; typen enzo. Ik zou zo graag willen dat dit automatisch gebeurt.

Uhm, zoals het er staat was mijn bedoeling? En trouwens, &euro; is niet nodig, hoor. In ieder geval in XHTML 1.1 (waarin ik net even getest heb) mag je gewoon het €-teken in je source gebruiken, maar alleen als je ISO-8859-15 als charset hebt. En dat geldt ook voor alle andere karakters, op < en > en & na, maar die laatste kan je via die functie fixen.

eddie 13-11-2003 07:54

Voor zover ik het weet transansformeert een textarea de special chars automatisch. Dus een / wordt %xx.

Enlightenment 13-11-2003 08:24

Citaat:

eddie schreef op 13-11-2003 @ 08:54:
Voor zover ik het weet transansformeert een textarea de special chars automatisch. Dus een / wordt %xx.
Nope, zie bijvoorbeeld:
http://validator.w3.org/check?uri=ht...ss=1&verbose=1

Ik kan idd die andere charset gebruiken zodat ik het euroteken gewoon kan gebruiken en niet met &amp;euro; hoef te werken. Maar ik wil het eigenlijk netjes doen, zodat andere karakters zoals « en » en nog vele anderen als html-specialchars worden geparsed.

Nu kan ik voor elke specialchar een parser maken, en voor de < en > dan << en >> gebruiken, zodat ik deze kan parsen. < en > kan ik niet parsen, omdat ik deze niet kan onderscheiden van HTML-code. Tenzij ik daar een mega-ingewikkeld regexp-search voor maak, en ik heb echt 0 verstand van regexp's. :)

Lijkt dit jullie de beste methode?

eddie 13-11-2003 08:55

Citaat:

Enlightenment schreef op 13-11-2003 @ 09:24:
Nope
Een andere browser dan IE dan? AFAIK doet Opera het wel.

Chimera 13-11-2003 09:22

Citaat:

Enlightenment schreef op 12-11-2003 @ 19:57:
Wat deathz0rz zegt is idd een optie, maar kan het niet anders?

Eigen parser-functie maken? Zo veel hoeft er niet gereplaced te worden.

Enlightenment 13-11-2003 11:16

Nouja ik moet alle (X)HTML tags af dan, en ook nog eens controleren of ze wel goed afgesloten zijn, en dat zonder kennis van regexp's? :(

Fade of Light 13-11-2003 11:30

Citaat:

Enlightenment schreef op 13-11-2003 @ 12:16:
Nouja ik moet alle (X)HTML tags af dan, en ook nog eens controleren of ze wel goed afgesloten zijn, en dat zonder kennis van regexp's? :(
reguliere expressies zijn simpel, het probleem is alleen ff rustig het overzicht te houden :)

Enlightenment 13-11-2003 12:05

Simpel my ass! :eek:

Ik vind dit nog makkelijker:

while (strstr($msg,'url:'))
$msg = substr_replace($msg,'<a target="_blank" href="'.substr($msg, strpos($msg,'url:') + 4, strpos($msg,'{')-strpos($msg,'url:')-4).'">'. substr($msg,strpos($msg, '{')+1, strpos($msg, '}')-strpos($msg, '{')-1). '</a>',strpos($msg,'url:'), strpos($msg,'}')-strpos($msg, 'url:')+1);

Dit is de parse functie voor de url:http://www.fluffles.net{www.fluffles.net klik hier!} UBB-like tag. Inmiddels vervangen door een véél minder dirty parse loop. :p

Enlightenment 13-11-2003 12:11

Citaat:

eddie schreef op 13-11-2003 @ 09:55:
Een andere browser dan IE dan? AFAIK doet Opera het wel.
Volgens mij begrijp je me verkeerd, ik zie uiteindelijk wel euro-tekens in het document, maar mijn document is niet meer XHTML compliant, en dat vind ik belangrijk. Ik doe het graag op de nette manier.

(ik gebruik Mozilla Firebird)

eddie 13-11-2003 12:38

Citaat:

Enlightenment schreef op 13-11-2003 @ 13:11:
Volgens mij begrijp je me verkeerd, ik zie uiteindelijk wel euro-tekens in het document, maar mijn document is niet meer XHTML compliant, en dat vind ik belangrijk. Ik doe het graag op de nette manier.

(ik gebruik Mozilla Firebird)

http://www.w3.org/TR/html401/interac...m-content-type

je kan toch kijken welke %xx waarde wordt meegestuurd voor het euro teken, en die vervangen door de correcte code?

deathz0rz 13-11-2003 13:59

Citaat:

Enlightenment schreef op 13-11-2003 @ 13:05:
Simpel my ass! :eek:

Ik vind dit nog makkelijker:

while (strstr($msg,'url:'))
$msg = substr_replace($msg,'<a target="_blank" href="'.substr($msg, strpos($msg,'url:') + 4, strpos($msg,'{')-strpos($msg,'url:')-4).'">'. substr($msg,strpos($msg, '{')+1, strpos($msg, '}')-strpos($msg, '{')-1). '</a>',strpos($msg,'url:'), strpos($msg,'}')-strpos($msg, 'url:')+1);

Dit is de parse functie voor de url:http://www.fluffles.net{www.fluffles.net klik hier!} UBB-like tag. Inmiddels vervangen door een véél minder dirty parse loop. :p

dat makkelijker dan een RegExp? rofl

Enlightenment 14-11-2003 03:56

Citaat:

deathz0rz schreef op 13-11-2003 @ 14:59:
dat makkelijker dan een RegExp? rofl
:D

One big messy shit huh. Toen ik 'em klaar had kwam ik even niet meer bij van het lachen, want zonder highlighting is daar niets meer van te maken natuurlijk. bovendien was het wel heel erg dirty, heb het nu wel netjes gedaan.

Maar regexp's ken ik gewoon niet. Een kleine tutorial heb ik wel gelezen en dat kon ik volgen
maar andere docs gaan al snel verder tot complexere shit en dan weet ik het niet meer. :p

Enlightenment 14-11-2003 03:57

Maar bedankt mensen, ik ga het nu zo doen:

Ik ga alles door een htmlentities filter gooien, muv de < en > tags die voor html gebruikt worden. Dan de << en >> converten naar &amp;lt; en &amp;gt;. Dan ben ik eigenlijk klaar.

Als het gelukt is laat ik het jullie wel weten. :)

deathz0rz 14-11-2003 07:00

ok, zie dan ook: http://nl3.php.net/manual/en/functio...tion-table.php

Manuzhai 14-11-2003 09:18

Uhm, je moet dus wel op speciale gevallen letten. Misschien wil je wel ergens <a href="index.php">>> hebben, en ik denk dat dat een beetje misgaat. :P

Enlightenment 14-11-2003 12:48

Links gaan bij mij zo:

int:/computers/hardware{Hardware}
ext:http://www.google.com{Google}

int = internal link
ext = external link (opent in extern window met target="_blank")

eddie 14-11-2003 13:03

Citaat:

Enlightenment schreef op 14-11-2003 @ 13:48:
opent in extern window met target="_blank"

En dat is niet geldig XHTML ;)

Manuzhai 15-11-2003 15:35

Citaat:

eddie schreef op 14-11-2003 @ 14:03:
En dat is niet geldig XHTML ;)
Wel als het Transitional is. :P

Enlightenment 15-11-2003 19:20

XHTML 1.0 Strict DTD

K'zie wel hoe ik het doe. Vind het wel jammer want zie niet in waarom dat weg zou moeten. Vind het juist goed dat er een advisory URI target is, default in nieuw window/tab openen of in zelfde tab.

:(

Manuzhai 16-11-2003 09:24

Je kunt een eigen DTD maken met de Target Module bij de Basic Module. Ik weet alleen niet of je document dan nog valideert tegen de W3c validator.


Alle tijden zijn GMT +1. Het is nu 02:33.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.