<?php
class MyParser {
private $domdoc;
public function __construct(DOMDocument $domdoc){
$this->domdoc = $domdoc;
}
public function __toString()
{
return $this->domdoc->saveHTML();
}
public function replaceVariableInside($varName, $text, $idType, $idValue)
{
$nodes = $this->getNodes($idType, $idValue);
$newTextNode = $this->getNodeFromText($text);
array_map(function($node) use ($varName, $newTextNode){
/* @var $node DOMNode */
$textNodes = array_filter($this->dnl2array($node->childNodes), function($node){
return $node->nodeType === XML_TEXT_NODE;
});
foreach ($textNodes as $textNode)
{ /* @var $textNode \DOMText */
if(@$pos && $pos !== false)
{
$newTextNode = $newTextNode->cloneNode(true);
}
$pos = strpos($textNode->nodeValue, $varName);
if($pos !== false)
{
$newNode = $textNode->splitText($pos);
$newNode->nodeValue = substr($newNode->nodeValue, strlen($varName));
$newNode->parentNode->insertBefore($newTextNode, $newNode);
}
}
}, $nodes);
}
protected function getNodes($idType, $idValue)
{
switch ($idType){
case 'id':
return [
$this->domdoc->getElementById($idValue)
];
break;
case 'class':
return $this->dnl2array((new DOMXPath($this->domdoc))
->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $idValue ')]"));
break;
default:
break;
}
}
public function insertInto($idType, $id, $text)
{
$newnode = $this->getNodeFromText($text);
array_map(function($elementOfDom) use ($newnode){
/* @var $elementOfDom DOMNode */
@$elementOfDom->appendChild($newnode);
}, $this->getNodes($idType, $id));
}
protected function getNodeFromText($text)
{
$text = html_entity_decode($text);
try
{
$tmp = new DOMDocument;
$textDocumentRes = @$tmp->loadHTML('<?xml encoding="utf-8" ?><span>'.$text.'</span>');
}
catch(Exception $e)
{
$textDocumentRes = false;
}
if($textDocumentRes)
{
$newnode = $this->domdoc->importNode($tmp->documentElement->firstChild->firstChild, true);
}
else
{
$newnode = $this->domdoc->createTextNode($text);
$newnode->nodeValue = $text;
}
return $newnode;
}
private function dnl2array($domnodelist) {
$return = array();
$length = $domnodelist->length;
for ($i = 0; $i < $length; ++$i) {
$return[] = $domnodelist->item($i);
}
return $return;
}
}
$domdocu = new DomDocument();
$domdocu->loadHTML('
<html>
<head>
</head>
<body>
<div id="first">
b%ELEMENT%a
</div>
<div class="second">
%ELEMENT%
<div class="third">
%ELEMENT%
</div>
</div>
<div class="fourth">%ELEMENT%</div>
<div class="fourth">%ELEMENT%</div>
<div class="fifth">a%ELEMENT%b</div>
</body>
</html>
');
$parser = new MyParser($domdocu);
$parser->insertInto('class', 'third', 'newtesttxtxttx');
$parser->replaceVariableInside('%ELEMENT%', 'TEEEXT', 'id', 'first');
$parser->replaceVariableInside('%ELEMENT%', 'TEEEXT', 'class', 'second');
$parser->replaceVariableInside('%ELEMENT%', 'TEEEXT', 'class', 'fourth');
$parser->replaceVariableInside('%ELEMENT%', 'TEEEXT', 'class', 'fifth');
echo $parser;
preferences:
51.91 ms | 402 KiB | 5 Q