A converter o HTML para texto simples em PHP para E-mail

USOTinyMCE para permitir a formatação mínima do texto no meu site. A partir do HTML que é produzido, eu gostaria de convertê-lo em texto simples para E-mail. Eu tenho usado uma classe chamada html2text , mas ela realmente não tem suporte para UTF-8, entre outras coisas. Eu faço, no entanto, como que mapeia certas tags HTML para formatação de texto simples - como colocando underscores em torno de texto que anteriormente tinha tags no HTML.

Alguém usa uma abordagem semelhante para a converter o HTML para texto simples no PHP? E se assim for: você recomenda alguma classe de terceiros que eu possa usar? Ou como é que se resolve melhor esta questão?

Author: Benjamin, 2009-12-11

14 answers

Use html2text (exemplo HTML to text ), licenciado sob a Eclipse Public License . Ele usa os métodos DOM do PHP para carregar a partir de HTML, e então itera sobre o dom resultante para extrair texto simples. Utilização:

// 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);

Embora incompleto, é de código aberto e as contribuições são bem-vindas.

Problemas com outros programas de conversão:

  • Uma vez que html2text (GPL) não é compatível com EPL.
  • ikessler's link (atribuição) é incompatível com a maioria das licenças de código aberto.
 87
Author: jevon, 2018-06-12 00:23:38

Ali está a função fiel strip_tags. Mas não é bonito. Só vai desinfectar. Você poderia combiná-lo com um substituto de string para obter seus underscores extravagantes.


<?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)));

?>
 12
Author: pestilence669, 2009-12-11 01:46:23

A conversão de HTML para texto usando um DOMDocument é uma solução viável. Considere o HTML2Text, que requer PHP5:

Em relação ao UTF-8, a escrita na página "howto" diz:

O próprio apoio do PHP ao unicode é muito pobre, e não o é. manipular sempre o utf-8 correctamente. Embora o script html2text use métodos unicode-safe (sem precisar do módulo mbstring), ele nem sempre consegue lidar com o próprio tratamento de codificações do PHP. PHP realmente não entende unicode ou codificações como utf-8, e usa a codificação base do sistema, que tende a ser uma da família ISO-8859. Como resultado, o que pode parecer para você como um personagem válido em seu editor de texto, em utf-8 ou single-byte, pode muito bem ser mal interpretado pelo PHP. Mesmo que você acha que está alimentando um personagem válido em html2text, você pode muito bem não estar.

O autor fornece várias abordagens para resolver isso e afirma que a versão 2 do HTML2Text (usando DOMDocument) tem suporte para UTF-8.

Note as restrições para uso comercial.

 12
Author: lkessler, 2014-02-22 22:53:39

Aqui está outra solução:

$cleaner_input = strip_tags($text);

Para outras variações das funções de higienização, ver:

Https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php

 8
Author: T.Todua, 2018-02-02 08:13:31

Pode usar o lynx com as opções-stdin e-dump para conseguir isso:

<?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";
}
 7
Author: nad2000, 2012-03-08 02:32:04

Pode testar esta função

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);
}
 6
Author: HoangLong85, 2013-12-13 03:40:18

Eu não encontrei nenhuma das soluções existentes encaixando-e-mails HTML simples para arquivos de texto simples.

Abri este repositório, espero que ajude alguém. Licença MIT, a propósito:)

Https://github.com/RobQuistNL/SimpleHtmlToText

Exemplo:

$myHtml = '<b>This is HTML</b><h1>Header</h1><br/><br/>Newlines';
echo (new Parser())->parseString($myHtml);
O

Devolve:

**This is HTML**
### Header ###


Newlines
 4
Author: Rob Quist, 2016-11-21 20:19:43

O Markdownify converte o HTML para o Markdown, um sistema de formatação de texto simples usado neste mesmo site.

 2
Author: outis, 2011-12-28 10:14:19
O Markdownify trabalhou muito bem para mim! o que tem a ser mencionado sobre ele: ele suporta perfeitamente utf-8, Qual foi a principal razão pela qual eu estava procurando uma outra solução que html2text (o que foi mencionado anteriormente neste tópico).
 1
Author: jebbie, 2012-05-14 18:01:55
Cheguei ao mesmo problema que a operação, e tentar algumas soluções das respostas superiores acima não resultou para os meus cenários. Vê porquê no fim.

Em vez disso, encontrei este argumento útil, para evitar confusão vamos chamá-lo html2text_roundcube, disponível sob GPL:

É na verdade uma versão atualizada de um script já mencionado - http://www.chuggnutt.com/html2text.php - atualizado pelo RoundCube correio.

Utilização:

$h2t = new \Html2Text\Html2Text('Hello, &quot;<b>world</b>&quot;');
echo $h2t->getText(); // prints Hello, "WORLD"

Porque html2text_roundcube provou ser melhor do que os outros:

  • Script http://www.chuggnutt.com/html2text.php não funcionou fora da caixa para casos com códigos/nomes HTML especiais (eg &auml;), ou aspas não emparelhadas (eg <p>25" Monitor</p>).

  • O Script https://github.com/soundasleep/html2text não tinha nenhuma opção para esconder ou agrupar as ligações no final do texto, fazendo com que uma página HTML normal parecesse inchada com ligações quando em formato simples de texto; personalizar o código para um tratamento especial de como a transformação é feita não é tão simples como editar um array em html2text_roundcube.

 1
Author: Chris Dev, 2016-11-24 16:10:53

Acabei de encontrar uma função PHP "strip_tags()" e está a funcionar no meu caso.

Tentei converter o seguinte HTML:

<p><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 7.5pt;">&nbsp;</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?&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?</p>

Depois de aplicar a função strip_tags (), tenho o seguinte resultado :

&amp;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?&amp;nbsp; Statistics show revenue notably declined in 2008 and  2009. But interestingly enough, those that monitor these trends state  that despite the industry&#039;s lackluster performance during this time,  revenue has grown at an average annual rate&amp;nbsp;of 2.2% over the last five  years, to $9.0 billion in 2010.&amp;nbsp; So despite the downturn, how were we  able to manage growth as an industry?
 0
Author: sudip, 2012-05-16 21:17:33

Se não quiser remover as marcas por completo e manter o conteúdo dentro das marcas, poderá usar o DOMDocument e extrair o textContent do nó raiz como este:

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!
Uma vantagem desta abordagem é que não requer pacotes externos.
 0
Author: supersan, 2018-04-02 17:02:01

Se você quiser converter Os caracteres especiais HTML e não apenas removê-los, bem como tirar as coisas para baixo e preparar para texto simples esta foi a solução que funcionou para mim...

function htmlToPlainText($str){
    $str = str_replace('&nbsp;', ' ', $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 (&nbsp;) a test</p>
<div>Yes this is! &amp; does it get "processed"? </div>'

htmlToPlainText($string);
// "this is ( ) a test. Yes this is! & does it get processed?"`

Html_entity_ Decode w / ENT_ quotes | ENT_XML1 converte coisas como &#39; htmlspecialchars_ decode converte coisas como &amp; html_ entity_ decode converte coisas como '&lt; e o 'strip_ tags' remove todas as marcas de HTML que restam.

 0
Author: Jay, 2018-05-15 14:36:04
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);

Resultado
texto 1
texto 2
cadeia 3
texto 4
texto 5

 0
Author: Aommy Indy, 2018-05-28 10:14:39