This commit is contained in:
Lizandro Guarnizo
2026-04-25 14:57:54 -05:00
parent fa1f4bc581
commit f71e009641
2 changed files with 43 additions and 9 deletions
+14 -3
View File
@@ -106,14 +106,25 @@ class BancolombiaParser
}
/**
* Elimina etiquetas HTML y decodifica entidades.
* Elimina completamente bloques <style>, <script>, <head> y luego
* convierte etiquetas estructurales en saltos de línea antes de strip_tags.
*/
private static function stripHtml(string $text): string
{
// Reemplazar <br>, <p>, <div>, <tr>, <li> con salto de línea para preservar estructura
$text = preg_replace('/<(br\s*\/?|\/p|\/div|\/tr|\/li)>/i', "\n", $text);
// Eliminar bloques cuyo contenido no es texto visible
$text = preg_replace('/<style[^>]*>.*?<\/style>/si', '', $text);
$text = preg_replace('/<script[^>]*>.*?<\/script>/si', '', $text);
$text = preg_replace('/<head[^>]*>.*?<\/head>/si', '', $text);
// Convertir etiquetas estructurales a saltos de línea
$text = preg_replace('/<(br\s*\/?\s*|\/p|\/div|\/tr|\/li|\/td)>/i', "\n", $text);
// Quitar todas las etiquetas restantes
$text = strip_tags($text);
// Decodificar entidades HTML
$text = html_entity_decode($text, ENT_QUOTES | ENT_HTML5, 'UTF-8');
return $text;
}
}
+29 -6
View File
@@ -291,7 +291,7 @@ class CorreoImapService
private function cleanBody(string $body): string
{
// Quitar quoted-printable si aplica
// Quitar quoted-printable si aplica (antes de tocar HTML)
if (str_contains($body, '=\r\n') || preg_match('/=[0-9A-F]{2}/i', $body)) {
$body = quoted_printable_decode($body);
}
@@ -302,12 +302,9 @@ class CorreoImapService
// Eliminar líneas de cabecera de parte MIME (Content-Type, etc.)
$body = preg_replace('/^(Content-[^\r\n]+\r?\n)+/mi', '', $body);
// Si el cuerpo contiene HTML, convertir bloques estructurales a saltos
// de línea y luego quitar todas las etiquetas para obtener texto plano
// Si el cuerpo contiene HTML, procesarlo adecuadamente
if (preg_match('/<[a-z][\s>]/i', $body)) {
$body = preg_replace('/<(br\s*\/?|\/p|\/div|\/tr|\/li)>/i', "\n", $body);
$body = strip_tags($body);
$body = html_entity_decode($body, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$body = self::stripHtmlFull($body);
}
// Normalizar saltos de línea
@@ -318,4 +315,30 @@ class CorreoImapService
return trim($body);
}
/**
* Elimina completamente bloques <style>, <script>, <head> y luego
* convierte etiquetas estructurales en saltos de línea antes de strip_tags.
*/
private static function stripHtmlFull(string $html): string
{
// 1. Eliminar bloques cuyo contenido no es texto visible
$html = preg_replace('/<style[^>]*>.*?<\/style>/si', '', $html);
$html = preg_replace('/<script[^>]*>.*?<\/script>/si', '', $html);
$html = preg_replace('/<head[^>]*>.*?<\/head>/si', '', $html);
// 2. Convertir saltos estructurales a \n
$html = preg_replace('/<(br\s*\/?\s*|\/p|\/div|\/tr|\/li|\/td)>/i', "\n", $html);
// 3. Quitar todas las etiquetas restantes
$html = strip_tags($html);
// 4. Decodificar entidades HTML (&amp; &nbsp; etc.)
$html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// 5. Limpiar espacios por línea y líneas en blanco excesivas
$lines = array_map('trim', explode("\n", $html));
$lines = array_filter($lines, fn($l) => $l !== '');
return implode("\n", $lines);
}
}