/** * Adds UUID data attributes to all elements in the document, skipping cdata blocks. * @param $html html source * @return string */ public function applyElementUuids($html) { //remove CDATA blocks from source and replace with tokens $cdata = array(); $html = preg_replace_callback('/<!\\[CDATA\\[((?:[^]]|\\](?!\\]>))*)\\]\\]>/', function ($matches) use(&$cdata) { $index = count($cdata); $replacement = "{{{CDATA-{$index}" . "}}}"; $cdata[$index] = $matches[0]; return $replacement; }, $html); //Add uuid attribute to all tags $content = preg_replace_callback("/(<([\\w]+)[^>]*>)/", function ($matches) { if (strpos($matches[0], 'data-chaucer-element-id') === false) { $id = Uuid::v4(); $search = '<' . $matches[2]; $replace = '<' . $matches[2] . ' data-chaucer-element-id="' . $id . '"'; return str_replace($search, $replace, $matches[0]); } return $matches[0]; }, $html); //Put CDATA blocks back into source if (count($cdata) > 0) { for ($x = 0; $x < count($cdata); $x++) { $search = "{{{CDATA-{$x}" . "}}}"; $content = str_replace($search, $cdata[$x], $content); } } return $content; }
/** * @brief Generates a Universally Unique IDentifier, version 1, 3, 4 or 5. * * This function generates a truly random UUID. The built in CakePHP String::uuid() function * is not cryptographically secure. You should uses this function instead. * * @see http://tools.ietf.org/html/rfc4122#section-4.4 * @see http://en.wikipedia.org/wiki/UUID * @return string A UUID, made up of 32 hex digits and 4 hyphens. */ function generate($version = null, $ns = null, $name = null) { if ($version == null) { $version = $this->version; } switch ($version) { case Uuid::UUID_V1: return Uuid::v1(); case Uuid::UUID_V3: return Uuid::v3($ns, $name); case Uuid::UUID_V4: return Uuid::v4(); case Uuid::UUID_V5: return Uuid::v5($ns, $name); } }