[HTML/PHP] Onderscheid tussen platte tekst en entiteiten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Om te testen gebruik ik onderstaande code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
echo $_GET['text'].'<br/>';
echo htmlentities( $_GET['text'] ).'<br/>';
echo strlen( $_GET['text'] ).'<br/>';

echo <<<HTML
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
    </head>
    <body>
      <form method="get" action="{$_SERVER['PHP_SELF']}">
        <input type="text" name="text">
      </form>
    </body>
  </html>
HTML;
?>
Karakters uit de ISO-8859-15 set vormen geen probleem, andere karakters wel. Als je een ¼-karakter invoert zal de browser deze omzetten naar een HTML-entiteit omdat deze niet in ISO-8859-15 voorkomt.

De uitvoer ziet er dan zo uit:
¼
&#188;
6

Voer je echter ¼ &#188; in dan is de uitvoer gelijk. Is het mogelijk om onderscheid te maken wat de gebruiker heeft ingevoerd? (een ¼ of de tekst &#188; ?)

Edit: zie dat GoT hier ook problemen mee heeft ;)
Heb in de tekst &#188; de & door &amp; moeten vervangen.

[ Voor 6% gewijzigd door Icelus op 15-09-2006 21:41 ]

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Lijkt me niet mogelijk, je kunt niet zien of een browser iets heeft gewijzigd of dat de gebruiker het zelf zo heeft ingevoerd.

Is het geen mogelijkheid voor je om UTF-8 te gebruiken welke de 1/4-character wel kent? Dan zal de browser deze ook niet omzetten naar een entitie.

[ Voor 37% gewijzigd door Shadowman op 15-09-2006 16:51 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Je zou verschillende resultaten moeten krijgen. Als het 1/4 teken wordt omgezet dan zou ook het & teken omgezet moeten worden naar een entiteit, en dat gebeurt ook in de meeste/alle browsers.

Als ik het test met jouw waarden dan krijg ik ook gewoon verschillen te zien --- maar ik testte zonder charset ingesteld te hebben. Waarom het met charset fout gaat zie ik niet :?

[ Voor 15% gewijzigd door _js_ op 15-09-2006 19:42 ]


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Shadowman schreef op vrijdag 15 september 2006 @ 16:50:
Lijkt me niet mogelijk, je kunt niet zien of een browser iets heeft gewijzigd of dat de gebruiker het zelf zo heeft ingevoerd.

Is het geen mogelijkheid voor je om UTF-8 te gebruiken welke de 1/4-character wel kent? Dan zal de browser deze ook niet omzetten naar een entitie.
Bij UTF-8 heb je dat probleem inderdaad niet. Probleem is dat de teksten in/uit een database komen die geen UTF-8 ‘begrijpt’ (qua sorteren e.d.).
_js_ schreef op vrijdag 15 september 2006 @ 19:26:
Je zou verschillende resultaten moeten krijgen. Als het 1/4 teken wordt omgezet dan zou ook het & teken omgezet moeten worden naar een entiteit, en dat gebeurt ook in de meeste/alle browsers.

Als ik het test met jouw waarden dan krijg ik ook gewoon verschillen te zien --- maar ik testte zonder charset ingesteld te hebben. Waarom het met charset fout gaat zie ik niet :?
De & blijft gelijk (te zien in de URL waar het gecodeerd wordt als %26).
Bij ¼ zie je in de URL %26%23188%3B ofwel & # 188 ;

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

GoT heeft hier geen probleem mee maar ziet dat het al een entity is en zal het derhalve niet nogmaals omzetten (tenzij je de [nohtml]-tag gebruikt) ;)
Meest eenvoudige methode is iets als:
PHP:
1
$string = preg_replace('/&amp;(#(\d{2,7}|(x)[0-9a-f]{2,6})|[a-z]{3,8});/i', '&$1;', htmlspecialchars($string));

maar als je het echt goed wilt doen dan vind je hier een overzicht van alle entiteiten gedefinieerd in HTML ;)

[ Voor 5% gewijzigd door crisp op 15-09-2006 22:40 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
crisp schreef op vrijdag 15 september 2006 @ 22:37:
GoT heeft hier geen probleem mee maar ziet dat het al een entity is en zal het derhalve niet nogmaals omzetten (tenzij je de [nohtml]-tag gebruikt) ;)
Meest eenvoudige methode is iets als:
PHP:
1
$string = preg_replace('/&amp;(#(\d{2,7}|(x)[0-9a-f]{2,6})|[a-z]{3,8});/i', '&$1;', htmlspecialchars($string));

maar als je het echt goed wilt doen dan vind je hier een overzicht van alle entiteiten gedefinieerd in HTML ;)
De [nohtml]-tag is dus alleen een stuuropdracht om de entiteit wel/niet om te zetten.
Ok, dan wordt het waarschijnlijk zo'n oplossing.

Developer Accused Of Unreadable Code Refuses To Comment

Pagina: 1