Para parsear contenido HTML podemos usar la clase DOMDocument. Con ella podremos buscar elementos, añadir atributos, etc…
// Nos creará en el código de salida la estructura HTML (html, head, body…)
$dom = new \DOMDocument;
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors($internalErrors);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $item) {
if($item->hasAttribute('variationid') && $item->getAttribute('variationid') == '00000') {
$item->setAttribute('variationid', $format->variation_id);
}
if($item->hasAttribute('variation')){
$item->setAttribute('variation', $format->variation);
}
}
$imgs = $dom->getElementsByTagName('img');
foreach($imgs as $item){
$item->setAttribute('alt', $format->alt);
}
$hrefs = $dom->getElementsByTagName('a');
foreach($hrefs as $item){
$item->setAttribute('title', $format->alt);
}
echo $dom->saveHTML();
// No nos creará una arbol html en la salida, respetará nuestra estructura (observar que en el loadHTML añadimos estos parámetros: LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
$dom = new \DOMDocument;
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_use_internal_errors($internalErrors);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $item) {
if($item->hasAttribute('variationid') && $item->getAttribute('variationid') == '00000') {
$item->setAttribute('variationid', $format->variation_id);
}
if($item->hasAttribute('variation')){
$item->setAttribute('variation', $format->variation);
}
}
$imgs = $dom->getElementsByTagName('img');
foreach($imgs as $item){
$item->setAttribute('alt', $format->alt);
}
$hrefs = $dom->getElementsByTagName('a');
foreach($hrefs as $item){
$item->setAttribute('title', $format->alt);
}
echo $dom->saveHTML();
Para evitar problemas con los caracteres especiales, añadiremos la propiedad encoding y la carga la la codificaremos con utf8_decode:
$dom = new \DOMDocument;
$dom->encoding = 'utf-8';
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML(utf8_decode($html));
