9
votes

HTML au texte brut (pour email)

Connaissez-vous un bon HTML à la classe de conversion de texte simple écrit en php?

J'en ai besoin pour convertir le corps du courrier HTML en corps de messagerie texte brut.

J'ai écrit une fonction simple, Mais j'ai besoin de plus de fonctionnalités telles que la conversion de tables, Ajout de liens à la fin, convertissant des listes imbriquées ...

- Cordialement
Takeshin


7 commentaires

Pourquoi pas juste envoyer un courrier html? Je comprends que les tables de simulation sont un peu possibles en clairexuant, mais chaque lecteur de courrier électronique du monde lit HTML, pourquoi ne pas vous épargner la peine de conversion inutile car vous ou quelqu'un d'autre refuse d'utiliser le courrier HTML.


Traviso: pas tous les lecteurs. Et certains ne convertissent pas automatiquement HTML en texte brut. Pour un utilisateur, le HTML RAW n'est généralement pas agréable de lire :-)


1996 est terminé, utilisez-le. Mais bien sûr, les types élitistes qui détestaient les courriels HTML vont être les plus vocaux / disposés à voter ces idéaux.


Il y a beaucoup de gens qui n'aiment pas lire des emails de fantaisie. Avez-vous vu votre email HTML sur de vieux téléphones?


Dans le projet Limesurvey, vous trouverez une pièce de code qui travaille avec la classe PHPMailer pour créer des éléments alt-corps de modèles de messagerie HTML. Autant que je sache, c'est assez bien adapté aux modèles HTML unique de qualité commerciale pouvant être écrits de manière à ce que les variantes de texte brut ne ressemblent pas à la merde. Si vous vous comparez également à la partie JavacSRIPT qui est l'intégration du composant CKEditor, vous devriez être capable de créer de superbes modèles en un rien de temps.


Dupliqué possible de Conversion de HTML en texte brut en PHP pour e -Mail


1996 est terminé, ... et maintenant nous avons des smartwatches. Si vous n'incluez pas de texte alternatif propre dans votre courrier électronique, les utilisateurs verront un désordre laids [Source Litmus Report sur l'état de messagerie 2016, chapitre sur l'IWatch] Bienvenue à 2016, @Traviso! Litmus.com/2016-State-Of-email-Report


7 Réponses :


6
votes

2 commentaires

Euh, avez-vous utilisé ou lu quelque chose à propos de Markdown? "L'objectif de conception primordial pour la syntaxe de formatage de Markdown est de le rendre aussi lisible que possible. L'idée est qu'un document formaté de marquage doit être publiable tel quel, en tant que texte brut, sans ressembler, il a été marqué avec des balises ou des instructions de formatage. "


Markownify est une bonne solution, en effet. Je l'ai déjà regardé, mais je pensais que cela ne convertit pas les tables. Mais le problème était que j'ai essayé sur des tables avec attributies et certains styles CSS. J'ai détruite des légendes manuellement et des attributs de classe et de style, et cela fonctionne bien.



5
votes

Un courrier particulier Envoi d'une implémentation d'ici ici simplement Spawns Lynx avec le HTML et utilise sa sortie pour la version texte. Ce n'est pas parfait mais fonctionne. Vous pouvez également utiliser liens ou Elinks .


3 commentaires

Oui, cela a déjà été suggéré sur Stackoverflow, mais je demandais à PHP Soultion. Je n'ai pas accès à Lynx à mon serveur. Merci.


Vous avez oublié de mentionner que vous avez besoin du -Dump arg pour lynx


Cela fonctionne généralement très bien, vous pouvez normalement l'utiliser avec une bonne conception de la conception Web centrée sur le contenu. Depuis des annees. +1



1
votes

Je sais que la question concerne PHP, mais j'ai utilisé l'idée de Lynx pour rendre ce sous-programme de perl pour convertir HTML en texte: xxx

impression: hi il y a le test


0 commentaires

3
votes

Vous pouvez utiliser Lynx avec -stdin et -Din Options pour atteindre cet objectif:

<?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";
}


0 commentaires

3
votes

Utiliser Lynx est une option uniquement si vous autorisez à exécuter des exécutables sur le serveur. Ce faisant, cependant, n'est pas considéré comme une bonne pratique. En outre, dans des hôtes sécurisés, le processus PHP est limité à ne pas être incapable de transmettre des sessions Bash, qui sont nécessaires pour exécuter Lynx.

La solution la plus complète écrite entièrement en PHP, j'ai pu trouver est le Horde_text_filter_html2text classe. Il fait partie du Cadre de Horde .

Autres solutions que j'ai essayées incluent:


0 commentaires

1
votes

in c #: xxx


0 commentaires

2
votes

Comme la question concerne PHP et j'ai trouvé le code C # de Dharmesh Hadiyal, je l'ai converti sur PHP.

(ne peut pas commenter, pas assez de réputation) P>

//From https://stackoverflow.com/questions/1930297/html-to-plain-text-for-email/23988241#23988241
//converted from c# to PHP
class HtmlToText
{
    public static function stripHTML($source)
    {
        // Remove HTML Development formatting
        // Replace line breaks with space
        // because browsers inserts space
        $result = str_replace("\r",  " ",$source );
        // Replace line breaks with space
        // because browsers inserts space
        $result = str_replace("\n",  " ",$result );
        // Remove step-formatting
        $result = str_replace("\t",  "",$result );
        // Remove repeating spaces because browsers ignore them
        $result = preg_replace("/( )+/im",  " ", $result);


        // Remove html-Tag (prepare first by clearing attributes)
        $result = preg_replace("/<( )*html([^>])*>\s*/im",  "<html>", $result);

        $result = preg_replace("/(<( )*(\/)( )*html( )*>)/im",  "</html>", $result);

        $result = preg_replace("/(<html>)|(<\/html>)/im",  "", $result);

        // Remove the header (prepare first by clearing attributes)
        $result = preg_replace("/<( )*head([^>])*>/im",  "<head>", $result);

        $result = preg_replace("/(<( )*(\/)( )*head( )*>)/im",  "</head>", $result);

        $result = preg_replace("/(<head>).*(<\/head>)/im",  "", $result);


        // remove all scripts (prepare first by clearing attributes)
        $result = preg_replace("/<( )*script([^>])*>/im",  "<script>", $result);

        $result = preg_replace("/(<( )*(\/)( )*script( )*>)/im",  "</script>", $result);

        //$result = System.Text.RegularExpressions.Regex.Replace($result,
        //         "(<script>)([^(<script>\.</script>)])*(</script>)",
        //         "",
        //         System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        $result = preg_replace("/(<script>).*(<\/script>)/im",  "", $result);


        // remove all styles (prepare first by clearing attributes)
        $result = preg_replace("/<( )*style([^>])*>/im",  "<style>", $result);

        $result = preg_replace("/(<( )*(\/)( )*style( )*>)/im",  "</style>", $result);

        $result = preg_replace("/(<style>).*(<\/style>)/im",  "", $result);


        // insert tabs in spaces of <td> tags
        $result = preg_replace("/<( )*td([^>])*>/im",  "\t", $result);


        // insert line breaks in places of <BR> and <LI> tags
        $result = preg_replace("/<( )*br( )*\/?>/im",  "\r", $result);

        $result = preg_replace("/<( )*li( )*>/im",  "\r", $result);


        // insert line paragraphs (double line breaks) in place
        // if <P>, <DIV> and <TR> tags
        $result = preg_replace("/<( )*div([^>])*>/im",  "\r\r", $result);

        $result = preg_replace("/<( )*tr([^>])*>/im",  "\r\r", $result);

        $result = preg_replace("/<( )*p([^>])*>/im",  "\r\r", $result);


        // Remove remaining tags like <a>, links, images,
        // comments etc - anything that's enclosed inside < >
        $result = preg_replace("/<[^>]*>/im",  "", $result);


        // replace special characters:
        $result = preg_replace("/ /im",  " ", $result);


        $result = preg_replace("/&bull;/im",  " * ", $result);

        $result = preg_replace("/&lsaquo;/im",  "<", $result);

        $result = preg_replace("/&rsaquo;/im",  ">", $result);

        $result = preg_replace("/&trade;/im",  "(tm)", $result);

        $result = preg_replace("/&frasl;/im",  "/", $result);

        $result = preg_replace("/&lt;/im",  "<", $result);

        $result = preg_replace("/&gt;/im",  ">", $result);

        $result = preg_replace("/&copy;/im",  "(c)", $result);

        $result = preg_replace("/&reg;/im",  "(r)", $result);

        // Remove all others. More can be added, see
        // http://hotwired.lycos.com/webmonkey/reference/special_characters/
        $result = preg_replace("/&(.{2,6});/im",  "", $result);


        // for testing
        //System.Text.RegularExpressions.Regex.Replace($result,
        //       this.txtRegex.Text,"",
            //       System.Text.RegularExpressions.RegexOptions.IgnoreCase);

        // make line breaking consistent
        $result = str_replace("\n",  "\r",$result );

        // Remove extra line breaks and tabs:
        // replace over 2 breaks with 2 and over 4 tabs with 4.
        // Prepare first to remove any whitespaces in between
        // the escaped characters and remove redundant tabs in between line breaks
        $result = preg_replace("/(\r)( )+(\r)/im",  "\r\r", $result);

        $result = preg_replace("/(\t)( )+(\t)/im",  "\t\t", $result);

        $result = preg_replace("/(\t)( )+(\r)/im",  "\t\r", $result);

        $result = preg_replace("/(\r)( )+(\t)/im",  "\r\t", $result);

        // Remove redundant tabs
        $result = preg_replace("/(\r)(\t)+(\r)/im",  "\r\r", $result);

        // Remove multiple tabs following a line break with just one tab
        $result = preg_replace("/(\r)(\t)+/im",  "\r\t", $result);

        // Initial replacement target string for line breaks
        $breaks = "\r\r\r";
        // Initial replacement target string for tabs
        $tabs = "\t\t\t\t\t";
        for ($index = 0; $index < strlen($result); $index++)
        {
            $result = str_replace($breaks,  "\r\r",$result );
            $result = str_replace($tabs,  "\t\t\t\t",$result );
            $breaks = $breaks . "\r";
            $tabs = $tabs . "\t";
        }

        //remove spaces at the beginning of a line
        $result = preg_replace("/^ +/im",  "", $result);

        //line breaks at the beginning/end is probably unwanted. Coluld be left over by removing <html>/<head>/<body>
        $result = trim($result);

        // That's it.
        return $result;
    }
}


0 commentaires