login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Handige scripts > htmlentities alleen op tekst uitvoeren

htmlentities alleen op tekst uitvoeren

Auteur: Grayen - 06 juli 2007 - 17:25 - Gekeurd door: Stijn - Hits: 2311 - Aantal punten: 3.50 (1 stem)




Ik heb soms het probleem dat ik graag htmlentities zou willen uitvoeren op een string, maar dat ik de valide html tags wil laten staan. Helaas is hier geen standaard functie voor. Dus ik heb er een geschreven. Deze functie laat alle xhtml tags staan en voert htmlentities op hetgeen wat daar niet onder valt.

Ik hoop dat je hem nuttig kunt gebruiken :-).

Edit
Zoals je waarschijnlijk wel in de reacties hebt kunnen lezen heeft ikkedikke een alternatief voor mijn script gegeven. Aan zijn manier van aanpak had ik nog niet gedacht. Zijn script is waarschijnlijk voor de meeste duidelijker, maar er zit een nadeel aan, namelijk dat hij 2x zo langzaam is als mijn versie.

PS: Ik ben aan een array met alle xhtml elementen gekomen, door op een site waarop alle tags stonden met een script alle gegevens eruit te filteren en deze in een array te zetten, dus mochten er nog mensen zijn die graag een array willen hebben met daarin alle tag namen en bijbehorende mogelijke attributen, dan moet je maar pm'en.

Code:
Mijn versie

  1. <?php
  2. function htmltagsonly($sString)
  3. {
  4. # Alle tags die zich in xhtml mogen bevinden.
  5. $aElements = array('body', 'head', 'html', 'title', 'abbr', 'acronym', 'address', 'blockquote', 'br', 'cite', 'code', 'dfn', 'div', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'kbd', 'p', 'pre', 'q', 'samp', 'span', 'strong', 'var', 'a', 'dl', 'dt', 'dd', 'ol', 'ul', 'li', 'object', 'param', 'b', 'big', 'hr', 'i', 'small', 'sub', 'sup', 'tt', 'del', 'ins', 'bdo', 'button', 'fieldset', 'form', 'input', 'label', 'legend', 'select', 'optgroup', 'option', 'textarea', 'caption', 'col', 'colgroup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'img', 'area', 'map', 'meta', 'noscript', 'script', 'style', 'link', 'base');
  6.  
  7. # De nieuwe string.
  8. $sNew = '';
  9.  
  10. # De tekst dat zich nog voor de tag bevindt.
  11. $sOther = '';
  12.  
  13. while(strlen($sString) > 0)
  14. {
  15. $iOpen = strpos($sString, '<');
  16. $iClose = strpos($sString, '>');
  17.  
  18. # Er is geen tag gevonden, het is dus tekst.
  19. if($iClose === false || $iOpen === false)
  20. {
  21. $sNew .= htmlentities($sString, ENT_QUOTES);
  22.  
  23. break;
  24. }
  25. else
  26. {
  27. # Is het echt wel een tag, zoals <tag> en niet zomaar twee haakjes als ><.
  28. while($iOpen > $iClose)
  29. {
  30. $iClose = strpos($sString, '>', $iClose + 1);
  31.  
  32. # Het was geen echte tag, dus het is tekst.
  33. if($iClose === false)
  34. {
  35. $sNew .= htmlentities($sString, ENT_QUOTES);
  36. }
  37. }
  38.  
  39. # Zit er niet nog een < voor de tag.
  40. $iTemp = strpos($sString, '<', $iOpen + 1);
  41. while($iOpen < $iTemp && $iTemp < $iClose)
  42. {
  43. $iOpen = $iTemp;
  44. $iTemp = strpos($sString, '<', $iOpen + 1);
  45. }
  46.  
  47. # Er is een tag gevonden.
  48. if($iOpen < $iClose)
  49. {
  50. $sTag = substr($sString, $iOpen, $iClose - $iOpen + 1);
  51.  
  52. # Heeft de tag wel een waarde en is het niet gewoon <>.
  53. $sTagValue = substr($sTag, 1, -1);
  54. if(empty($sTagValue) === true)
  55. {
  56. $iOpen = $iClose + 1;
  57. }
  58.  
  59. # De tekst voor de tag ophalen.
  60. $sTemp = substr($sString, 0, $iOpen);
  61. if(empty($sTemp) === false)
  62. {
  63. $sOther .= $sTemp;
  64. }
  65.  
  66. # Stond er nog tekst voor de tag?
  67. if(empty($sOther) === false)
  68. {
  69. $sNew .= htmlentities($sOther, ENT_QUOTES);
  70.  
  71. $sOther = '';
  72. }
  73.  
  74. # Is de tag niet leeg?
  75. if(empty($sTagValue) === false)
  76. {
  77. # Kijken of het een open of gesloten is.
  78. if($sTag{1} == '/') # Sluit tag.
  79. {
  80. # Haalt de tag naam uit de tag.
  81. if(($iEndPos = strpos($sTag, ' ')) !== false || ($iEndPos = strpos($sTag, '>')) !== false)
  82. {
  83. $sTagName = substr($sTag, 2, $iEndPos - 2);
  84. }
  85. }
  86. else # Open tag.
  87. {
  88. # Haalt de tag naam uit de tag.
  89. if(($iEndPos = strpos($sTag, ' ')) !== false || ($iEndPos = strpos($sTag, '/')) !== false || ($iEndPos = strpos($sTag, '>')) !== false)
  90. {
  91. $sTagName = substr($sTag, 1, $iEndPos - 1);
  92. }
  93. }
  94.  
  95. if(in_array($sTagName, $aElements) === false)
  96. {
  97. $sNew .= htmlentities($sTag, ENT_QUOTES);
  98. }
  99. else
  100. {
  101. $sNew .= $sTag;
  102. }
  103. }
  104.  
  105. # Hakt het al geparsde deel van de tekst af.
  106. $sString = substr($sString, $iClose + 1);
  107. }
  108. }
  109. }
  110.  
  111. return $sNew;
  112. }
  113. ?>


Ikkedikke's versie

  1. <?php
  2. function htmltagsonly($sString)
  3. {
  4. $sString = htmlentities($sString);
  5.  
  6. $sElements = 'blockquote|optgroup|noscript|colgroup|textarea|fieldset|acronym|caption|address|legend|script|strong|option|button|select|object|style|tfoot|thead|table|title|tbody|label|param|input|small|cite|abbr|head|samp|span|font|code|html|body|base|link|form|meta|area|big|pre|sup|sub|map|bdo|del|ins|var|div|img|dfn|kbd|col|dl|dt|h6|h2|h4|dd|h1|tt|h3|em|td|li|th|h5|ol|hr|tr|ul|br|p|i|q|a|b';
  7.  
  8. $sString = preg_replace("~(&lt;/?(".$sElements.")(.*?)&gt;)~ie", "html_entity_decode('\\1',ENT_QUOTES)", $sString);
  9.  
  10. return $sString;
  11. }
  12. ?>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (8)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.093s