<?php
function applyHLToSiblings(DOMDocument $D){
$words[0] = "cart";
/*
$words[1] = "car";
$words[2] = "cartel";
$words[3] = "art";
$words[4] = "drug";
$words[5] = "drugs";
$words[6] = "rug";
$words[7] = "rugs";
*/
$mt = function($content) use($D){
return $D->createTextNode($content);
};
$ms = function($content = null, $name) use($D){
$span = $D->createElement("span");
$span->setAttribute("class", "word$name");
$content === null ?: $span->appendChild($content);
return $span;
};
$ps = function($siblingsContainer, $searchString, $name) use($D, $ms, $mt){
foreach($siblingsContainer->childNodes as $node){
if($node instanceof DOMText){
if(mb_strlen($node->textContent, "UTF-8") >= mb_strlen($searchString)){
$o = mb_strpos($node->textContent, $searchString);
if($o !== false){
$l = mb_strlen($searchString, "UTF-8");
$before = mb_substr($node->textContent, 0, $o);
$wrap = mb_substr($node->textContent, $o, $l);
$after = mb_substr($node->textContent, $o + $l);
$after ? $node->parentNode->insertBefore($mt($after) , $node->nextSibling) : null;
$node->parentNode->insertBefore($ms($mt($wrap), $name) , $node->nextSibling);
$before ? $node->parentNode->insertBefore($mt($before) , $node->nextSibling) : null;
$node->parentNode->removeChild($node);
}
}
}
}
};
foreach($words as $name => $word)
$ps($D->documentElement, $word, $name);
}
$x = new DOMDocument();
$x->loadXML("<data>drugs cartel</data>");
applyHLToSiblings($x);
var_dump($x->saveXML());
preferences:
27.62 ms | 402 KiB | 5 Q