it-swarm.com.de

HTML in Nur-Text konvertieren PHP für e-mail

Ich benutze TinyMCE , um eine minimale Formatierung von Text auf meiner Site zu ermöglichen. Ich möchte den HTML-Code in E-Mail-Nachrichten konvertieren. Ich habe eine Klasse mit dem Namen html2text verwendet, aber es fehlt wirklich viel an UTF-8-Unterstützung. Ich mag es jedoch, dass bestimmte HTML-Tags einfacher Textformatierung zugeordnet werden, beispielsweise Unterstriche um Text, der zuvor <i> -Tags im HTML hatte.

Verwendet jemand einen ähnlichen Ansatz, um HTML in Klartext in PHP zu konvertieren? Und wenn ja: Empfehlen Sie Fremdkurse, die ich verwenden kann? Oder wie gehen Sie dieses Problem am besten an?

71
Justin Stayton

Verwenden Sie html2text (Beispiel HTML to text ), lizenziert unter der Eclipse Public License . Es verwendet die DOM-Methoden von PHP, um aus HTML zu laden, und durchläuft dann das resultierende DOM, um Klartext zu extrahieren. Verwendungszweck:

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

Obwohl unvollständig, ist es Open Source und Beiträge sind willkommen.

Probleme mit anderen Konvertierungsskripten:

89
jevon

Es gibt die vertrauenswürdige Funktion strip_tags . Es ist aber nicht hübsch. Es wird nur desinfizieren. Sie können es mit einem String ersetzen, um Ihre Unterstriche zu erhalten.


<?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
pestilence669

Das Konvertieren von HTML in Text mithilfe von DOMDocument ist eine praktikable Lösung. Betrachten Sie HTML2Text, für das PHP5 erforderlich ist:

In Bezug auf UTF-8 heißt es auf der "Howto" -Seite:

PHP-eigene Unterstützung für Unicode ist ziemlich schlecht und behandelt Utf-8 nicht immer korrekt. Obwohl das Skript html2text unicode-sichere Methoden verwendet (ohne das Modul mbstring zu benötigen), kann es nicht immer mit PHPs eigenem Umgang mit Kodierungen umgehen. PHP versteht Unicode oder Kodierungen wie utf-8 nicht wirklich und verwendet die Basiscodierung des Systems, das eher zur ISO-8859-Familie gehört. Was für Sie in Ihrem Texteditor wie ein gültiges Zeichen erscheint, entweder in utf-8 oder im Einzelbyte-Modus, kann von PHP möglicherweise falsch interpretiert werden. Auch wenn Sie glauben, dass Sie ein gültiges Zeichen in html2text eingeben, ist dies möglicherweise nicht der Fall.

Der Autor bietet mehrere Lösungsansätze und gibt an, dass Version 2 von HTML2Text (mit DOMDocument) UTF-8-Unterstützung hat.

Beachten Sie die Einschränkungen für die kommerzielle Nutzung.

12
lkessler

hier ist eine andere Lösung:

$cleaner_input = strip_tags($text);

Für andere Variationen der Desinfektionsfunktionen siehe:

https: // RunFor github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php

11
T.Todua

Sie können lynx mit den Optionen -stdin und -dump verwenden, um dies zu erreichen:

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

Sie können diese Funktion testen

function html2text($Document) {
    $Rules = array ('@<script[^>]*?>.*?</script>@si',
                    '@<[\/\!]*?[^<>]*?>@si',
                    '@([\r\n])[\s][email protected]',
                    '@&(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);
}
7
HoangLong85

Ich habe keine der vorhandenen Lösungen gefunden - einfache HTML-E-Mails für einfache Textdateien.

Ich habe dieses Repository geöffnet, hoffe es hilft jemandem. MIT Lizenz übrigens :)

https://github.com/RobQuistNL/SimpleHtmlToText

Beispiel:

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

kehrt zurück:

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


Newlines
5
Rob Quist

Wenn Sie konvertieren die HTML-Sonderzeichen nicht nur entfernen, sondern auch entfernen und Dinge für den einfachen Text vorbereiten möchten, war dies die Lösung, die für mich funktionierte ...

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 mit ENT_QUOTES | ENT_XML1 konvertiert Dinge wie &#39; Htmlspecialchars_decode konvertiert Dinge wie &amp; Html_entity_decode konvertiert Dinge wie '&lt; Und strip_tags entfernt verbleibende HTML-Tags.

2
Jay

Markdownify konvertiert HTML in Markdown, ein auf dieser Site verwendetes Klartextformatierungssystem.

2
outis

Ich bin mit dem gleichen Problem wie das OP umgegangen, und einige Lösungen aus den oberen Antworten oben auszuprobieren, hat sich in meinen Szenarien nicht bewährt. Sehen Sie warum am Ende.

Stattdessen habe ich dieses hilfreiche Skript gefunden. Um Verwirrung zu vermeiden, nennen wir es html2text_roundcube, verfügbar unter GPL:

Es ist eigentlich eine aktualisierte Version eines bereits erwähnten Skripts - http://www.chuggnutt.com/html2text.php -, das von RoundCube Mail aktualisiert wurde.

Verwendungszweck:

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

Warum html2text_roundcube besser als die anderen war:

  • Das Skript http://www.chuggnutt.com/html2text.php hat für Fälle mit speziellen HTML-Codes/-Namen (z. B. &auml;) oder ungepaarten Anführungszeichen (z. B. <p>25" Monitor</p>) nicht sofort funktioniert.

  • Das Skript https://github.com/soundasleep/html2text hatte keine Möglichkeit, die Links am Ende des Textes auszublenden oder zu gruppieren, wodurch eine normale HTML-Seite im Text-plain-Format mit Links aufgebläht wirkt. Das Anpassen des Codes für eine spezielle Behandlung der Transformation ist nicht so einfach wie das einfache Bearbeiten eines Arrays in html2text_roundcube.

1
Chris Dev
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);

Ausgabe
string 1
string 2
string 3
string 4
Saite 5

1
Aommy Indy

Markdownify hat für mich wunderbar funktioniert! Was muss erwähnt werden: Es unterstützt perfekt UTF-8. Was war der Hauptgrund, warum ich nach einer anderen Lösung gesucht habe als html2text (was zuvor in diesem Thread erwähnt wurde)?.

1
jebbie

Ich habe gerade eine PHP - Funktion "strip_tags ()" gefunden und funktioniert in meinem Fall.

Ich habe versucht, folgendes HTML zu konvertieren:

<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>

Nach dem Anwenden der Funktion strip_tags () habe ich folgende Ausgabe erhalten:

&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
sudip

Wenn Sie die Tags nicht vollständig entfernen möchten und den Inhalt innerhalb der Tags behalten möchten, können Sie die DOMDocument verwenden und die textContent des Stammknotens folgendermaßen extrahieren:

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!

Ein Vorteil dieses Ansatzes ist, dass keine externen Pakete erforderlich sind.

0
supersan