function cloakHTML($s) { $s = '' . $s; $return = array(); for ($i = 0; $i < strlen($s); $i++) { if (ctype_alnum($s[$i])) { $return[] = '&#' . ord($s[$i]) . ';'; } else { $return[] = fesc($s[$i]); } } return implode('', $return); }
public function testGetTagAttr() { $fesc = fesc($_ = "<&\"'>"); $tag = "\n <a data-value=1 fesc='{$fesc}' href='/about/' class=\"class\" target=_blank>About</a>\n "; $attr = getTagAttr($tag); $attrHref = getTagAttr($tag, 'href'); $attrNone = getTagAttr($tag, 'none'); $attrFesc = getTagAttr($tag, 'fesc'); $this->assertEquals($attr['href'], "/about/"); $this->assertEquals($attr['class'], "class"); $this->assertEquals($attr['target'], "_blank"); $this->assertEquals($attr['data-value'], "1"); $this->assertTrue($attrHref ? true : false); $this->assertFalse($attrNone ? true : false); $this->assertEquals($attrFesc, $_); }
function prepareAttr($attr) { $collector = array(); if (is_string($attr)) { $attr = getTagAttr($attr); } foreach ($attr as $k => $v) { if (!$v or !$k) { continue; } if (is_assoc($v)) { $_collector = array(); foreach ($v as $_k => $_v) { if (!$_v or !$_k) { continue; } $_collector[] = sprintf('%s:%s', fesc($_k), fesc($_v)); } $v = implode('; ', $_collector); } elseif (is_array($v)) { $v = implode(' ', $v); } $collector[] = sprintf('%s="%s"', $k, fesc($v)); } return implode(' ', $collector); }
private function toArray($node, $level) { $array = array(); if (!$node) { return array(); } if ($node instanceof DOMAttr) { return $node->value; } if ($node instanceof DOMNodeList) { foreach ($node as $n) { $array[] = $this->toArray($n, $level); } return $array; } if ($node->nodeType == XML_TEXT_NODE) { if ($level) { return esc(trim($node->nodeValue)); } else { return trim($node->nodeValue); } } if ($node->nodeType == XML_COMMENT_NODE) { return '<!--' . $node->nodeValue . '-->'; } @($tag = $node->tagName); if (!$tag) { return ''; } $collector = "<{$tag}%s>%s</{$tag}>"; $closed = "<{$tag}%s />"; $attr = array(); $inner = array(); if ($node->hasAttributes()) { foreach ($node->attributes as $a) { $attr[] = ' ' . sprintf('%s="%s"', $a->nodeName, fesc($a->nodeValue)); } } if ($node->hasChildNodes()) { foreach ($node->childNodes as $childNode) { $t = $this->toArray($childNode, $level + 1); if ($t or $t == 0) { $inner[] = $t; } } } $attr = implode('', $attr); $inner = implode('', $inner); if (!$inner and in_array($tag, explode(',', 'br,img,hr,param'))) { return sprintf($closed, $attr); } return sprintf($collector, $attr, $inner); }