php - plain - formulario de contacto html
Conversión de HTML a texto plano en PHP para correo electrónico (14)
¡Markdownify me funcionó de maravilla! qué hay que mencionar al respecto: admite perfectamente utf-8, ¿cuál fue la razón principal por la que estaba buscando otra solución que html2text (lo que se mencionó anteriormente en este hilo).
Uso TinyMCE para permitir un formato mínimo de texto dentro de mi sitio. A partir del HTML que se produce, me gustaría convertirlo en texto sin formato para el correo electrónico. He estado usando una clase llamada html2text , pero en realidad falta soporte UTF-8, entre otras cosas. Sí, me gusta que mapee ciertas etiquetas HTML al formato de texto plano, como poner guiones bajos alrededor del texto que previamente tenía etiquetas <i> en el HTML.
¿Alguien usa un enfoque similar para convertir HTML a texto sin formato en PHP? Y si es así: ¿Recomiendas alguna clase de terceros que pueda usar? ¿O cómo abordar este problema de la mejor manera?
Acabo de encontrar una función de PHP "strip_tags ()" y su funcionamiento en mi caso.
Traté de convertir el siguiente HTML:
<p><span style="font-family: ''Verdana'',''sans-serif''; color: black; font-size: 7.5pt;"> </span>Many practitioners are optimistic that the eyeglass and contact lens industry will recover from the recent economic storm. Did your practice feel its affects? Statistics show revenue notably declined in 2008 and 2009. But interestingly enough, those that monitor these trends state that despite the industry''s lackluster performance during this time, revenue has grown at an average annual rate of 2.2% over the last five years, to $9.0 billion in 2010. So despite the downturn, how were we able to manage growth as an industry?</p>
Después de aplicar la función strip_tags (), obtuve el siguiente resultado:
&nbsp;Many practitioners are optimistic that the eyeglass and contact lens industry will recover from the recent economic storm. Did your practice feel its affects?&nbsp; Statistics show revenue notably declined in 2008 and 2009. But interestingly enough, those that monitor these trends state that despite the industry's lackluster performance during this time, revenue has grown at an average annual rate&nbsp;of 2.2% over the last five years, to $9.0 billion in 2010.&nbsp; So despite the downturn, how were we able to manage growth as an industry?
Encontré el mismo problema que el OP, y probar algunas de las respuestas superiores no resultó para mis escenarios. Vea por qué al final.
En cambio, encontré este útil script, para evitar confusiones, vamos a llamarlo html2text_roundcube
, disponible bajo GPL:
En realidad, es una versión actualizada de un guión ya mencionado: http://www.chuggnutt.com/html2text.php
, actualizado por correo de RoundCube.
Uso:
$h2t = new /Html2Text/Html2Text(''Hello, "<b>world</b>"'');
echo $h2t->getText(); // prints Hello, "WORLD"
Por qué html2text_roundcube
resultó ser mejor que los demás:
Script
http://www.chuggnutt.com/html2text.php
no funcionó de la caja para casos con códigos / nombres HTML especiales (ej.ä
), o citas sin emparejar (ej.<p>25" Monitor</p>
).Script
https://github.com/soundasleep/html2text
no tenía ninguna opción para ocultar o agrupar los enlaces al final del texto, lo que hacía que una página HTML normal se viera hinchada con enlaces cuando estaba en formato texto plano; la personalización del código para un tratamiento especial de cómo se realiza la transformación no es tan simple como simplemente editar una matriz enhtml2text_roundcube
.
Existe la función de strip_tags confianza. Aunque no es lindo. Solo lo desinfectará Puede combinarlo con un reemplazo de cadena para obtener sus caracteres de subrayado de lujo.
<?php
// to strip all tags and wrap italics with underscore
strip_tags(str_replace(array("<i>", "</i>"), array("_", "_"), $text));
// to preserve anchors...
str_replace("|a", "<a", strip_tags(str_replace("<a", "|a", $text)));
?>
La conversión de HTML a texto utilizando DOMDocument es una solución viable. Considere HTML2Text, que requiere PHP5:
- http://www.howtocreate.co.uk/php/html2texthowto.html
- http://www.howtocreate.co.uk/php/
- http://www.howtocreate.co.uk/jslibs/termsOfUse.html
Con respecto a UTF-8, la descripción en la página "howto" indica:
El propio soporte de PHP para Unicode es bastante pobre, y no siempre maneja correctamente utf-8. Aunque el script html2text utiliza métodos seguros para unicode (sin necesidad del módulo mbstring), no siempre puede manejar el manejo de codificaciones propio de PHP. PHP realmente no entiende unicode o codificaciones como utf-8, y usa la codificación base del sistema, que tiende a ser uno de la familia ISO-8859. Como resultado, lo que puede parecerle un personaje válido en su editor de texto, ya sea en utf-8 o en un solo byte, bien puede ser malinterpretado por PHP. Entonces, aunque creas que estás introduciendo un personaje válido en html2text, es posible que no lo estés.
El autor proporciona varios enfoques para resolver esto y afirma que la versión 2 de HTML2Text (usando DOMDocument) tiene soporte para UTF-8.
Tenga en cuenta las restricciones para uso comercial.
No encontré ninguna de las soluciones existentes que se ajustan: simples correos electrónicos HTML a simples archivos de texto plano.
He abierto este repositorio, espero que ayude a alguien. Licencia de MIT, por cierto :)
https://github.com/RobQuistNL/SimpleHtmlToText
Ejemplo:
$myHtml = ''<b>This is HTML</b><h1>Header</h1><br/><br/>Newlines'';
echo (new Parser())->parseString($myHtml);
devoluciones:
**This is HTML**
### Header ###
Newlines
Puedes probar esta función
function html2text($Document) {
$Rules = array (''@<script[^>]*?>.*?</script>@si'',
''@<[///!]*?[^<>]*?>@si'',
''@([/r/n])[/s]+@'',
''@&(quot|#34);@i'',
''@&(amp|#38);@i'',
''@&(lt|#60);@i'',
''@&(gt|#62);@i'',
''@&(nbsp|#160);@i'',
''@&(iexcl|#161);@i'',
''@&(cent|#162);@i'',
''@&(pound|#163);@i'',
''@&(copy|#169);@i'',
''@&(reg|#174);@i'',
''@&#(d+);@e''
);
$Replace = array ('''',
'''',
'''',
'''',
''&'',
''<'',
''>'',
'' '',
chr(161),
chr(162),
chr(163),
chr(169),
chr(174),
''chr()''
);
return preg_replace($Rules, $Replace, $Document);
}
Puedes usar lynx con las opciones -stdin y -dump para lograr eso:
<?php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/htmp2txt.log", "a") // stderr is a file to write to
);
$process = proc_open(''lynx -stdin -dump 2>&1'', $descriptorspec, $pipes, ''/tmp'', NULL);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to htmp2txt.log
$stdin = $pipes[0];
fwrite($stdin, <<<''EOT''
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>TEST</title>
</head>
<body>
<h1><span>Lorem Ipsum</span></h1>
<h4>"Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."</h4>
<h5>"There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain..."</h5>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque et sapien ut erat porttitor suscipit id nec dui. Nam rhoncus mauris ac dui tristique bibendum. Aliquam molestie placerat gravida. Duis vitae tortor gravida libero semper cursus eu ut tortor. Nunc id orci orci. Suspendisse potenti. Phasellus vehicula leo sed erat rutrum sed blandit purus convallis.
</p>
<p>
Aliquam feugiat, neque a tempus rhoncus, neque dolor vulputate eros, non pellentesque elit lacus ut nunc. Pellentesque vel purus libero, ultrices condimentum lorem. Nam dictum faucibus mollis. Praesent adipiscing nunc sed dui ultricies molestie. Quisque facilisis purus quis felis molestie ut accumsan felis ultricies. Curabitur euismod est id est pretium accumsan. Praesent a mi in dolor feugiat vehicula quis at elit. Mauris lacus mauris, laoreet non molestie nec, adipiscing a nulla. Nullam rutrum, libero id pellentesque tempus, erat nibh ornare dolor, id accumsan est risus at leo. In convallis felis at eros condimentum adipiscing aliquam nisi faucibus. Integer arcu ligula, porttitor in fermentum vitae, lacinia nec dui.
</p>
</body>
</html>
EOT
);
fclose($stdin);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
echo "command returned $return_value/n";
}
Si desea convertir los caracteres especiales HTML y no solo eliminarlos, desmantelar y preparar el texto plano, esta fue la solución que funcionó para mí ...
function htmlToPlainText($str){
$str = str_replace('' '', '' '', $str);
$str = html_entity_decode($str, ENT_QUOTES | ENT_COMPAT , ''UTF-8'');
$str = html_entity_decode($str, ENT_HTML5, ''UTF-8'');
$str = html_entity_decode($str);
$str = htmlspecialchars_decode($str);
$str = strip_tags($str);
return $str;
}
$string = ''<p>this is ( ) a test</p>
<div>Yes this is! & does it get "processed"? </div>''
htmlToPlainText($string);
// "this is ( ) a test. Yes this is! & does it get processed?"`
html_entity_decode con ENT_QUOTES | ENT_XML1 convierte cosas como '
htmlspecialchars_decode convierte cosas como &
html_entity_decode convierte cosas como ''<
y strip_tags elimina cualquier etiqueta HTML sobrante.
Si no desea quitar las etiquetas por completo y mantener el contenido dentro de las etiquetas, puede usar DOMDocument
y extraer el textContent
de textContent
del nodo raíz de esta manera:
function html2text($html) {
$dom = new DOMDocument();
$dom->loadHTML("<body>" . strip_tags($html, ''<b><a><i><div><span><p>'') . "</body>");
$xpath = new DOMXPath($dom);
$node = $xpath->query(''body'')->item(0);
return $node->textContent; // text
}
$p = ''this is <b>test</b>. <p>how are <i>you?</i>. <a href="#">I/'m fine!</a></p>'';
print html2text($p);
// this is test. how are you?. I''m fine!
Una ventaja de este enfoque es que no requiere ningún paquete externo.
Use html2text (ejemplo HTML a text ), licenciado bajo la Licencia Pública de Eclipse . Utiliza los métodos DOM de PHP para cargar desde HTML, y luego itera sobre el DOM resultante para extraer texto sin formato. Uso:
// when installed using the Composer package
$text = Html2Text/Html2Text::convert($html);
// usage when installed using html2text.php
require(''html2text.php'');
$text = convert_html_to_text($html);
Aunque incompleto, es de código abierto y las contribuciones son bienvenidas.
Problemas con otras secuencias de comandos de conversión:
- Dado que html2text (GPL) no es compatible con EPL.
- El enlace de lkessler (atribución) es incompatible con la mayoría de las licencias de código abierto.
aquí hay otra solución:
$cleaner_input = strip_tags($text);
Para otras variaciones de funciones de desinfección, ver:
https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php
Markdownify convierte HTML en Markdown, un sistema de formato de texto plano utilizado en este mismo sitio.
public function plainText($text)
{
$text = strip_tags($text, ''<br><p><li>'');
$text = preg_replace (''/<[^>]*>/'', PHP_EOL, $text);
return $text;
}
$text = "string 1<br>string 2<br/><ul><li>string 3</li><li>string 4</li></ul><p>string 5</p>";
echo planText($text);
salida
cadena 1
cadena 2
cadena 3
cadena 4
cadena 5