![]() |
[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 &euro;. 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? |
|
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 |
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. :) |
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 &lt; enzo. |
Ik bedoel dan ook dat je als je daadwerkelijk een < of > wil laten zien gewoon < of > 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).
|
misschien kan je als je html typt << gebruiken en die dan tijdelijk replacen. ofzo.
|
Citaat:
Maar dit kan ja, maar dan moet ik dus al html'ed code gebruiken. Elke keer &euro; typen enzo. Ik zou zo graag willen dat dit automatisch gebeurt. Citaat:
Een ander idee is om HTML-code binnen de tags te houden. Binnen die tags wordt < en > dan dus niet geparsed naar &lt; en &gt;. |
Citaat:
|
Voor zover ik het weet transansformeert een textarea de special chars automatisch. Dus een / wordt %xx.
|
Citaat:
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 &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? |
Citaat:
|
Citaat:
|
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? :(
|
Citaat:
|
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 |
Citaat:
(ik gebruik Mozilla Firebird) |
Citaat:
je kan toch kijken welke %xx waarde wordt meegestuurd voor het euro teken, en die vervangen door de correcte code? |
Citaat:
|
Citaat:
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 |
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 &lt; en &gt;. Dan ben ik eigenlijk klaar. Als het gelukt is laat ik het jullie wel weten. :) |
ok, zie dan ook: http://nl3.php.net/manual/en/functio...tion-table.php
|
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
|
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") |
Citaat:
|
Citaat:
|
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. :( |
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.