Ich verwende TinyMCE , um eine minimale Formatierung von Text auf meiner Website zu ermöglichen. Aus dem erstellten HTML-Code möchte ich ihn für E-Mails in einfachen Text konvertieren. Ich habe eine Klasse namens html2text verwendet , aber es fehlt unter anderem die UTF-8-Unterstützung. Ich finde es jedoch gut, dass bestimmte HTML-Tags der Nur-Text-Formatierung zugeordnet werden - beispielsweise das Unterstreichen von Text, der zuvor <i> Tags im HTML-Code hatte.
Verwendet jemand einen ähnlichen Ansatz zum Konvertieren von HTML in einfachen Text in PHP? Und wenn ja: Empfehlen Sie Klassen von Drittanbietern, die ich verwenden kann? Oder wie gehen Sie dieses Problem am besten an?
Antworten:
Verwenden Sie html2text (Beispiel HTML zu Text ), das unter der Eclipse Public License lizenziert ist . Es verwendet die DOM-Methoden von PHP, um aus HTML zu laden, und iteriert dann über das resultierende DOM, um einfachen Text zu extrahieren. Verwendung:
// 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:
quelle
Hier ist eine andere Lösung:
Weitere Varianten der Desinfektionsfunktionen finden Sie unter:
https://github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php
quelle
$ClearText = preg_replace( "/\n\s+/", "\n", rtrim(html_entity_decode(strip_tags($HTMLText))) );
Die Konvertierung von HTML in Text mithilfe eines DOMDocument ist eine praktikable Lösung. Betrachten Sie HTML2Text, für das PHP5 erforderlich ist:
In Bezug auf UTF-8 heißt es in der Beschreibung auf der Seite "Howto":
Der Autor bietet verschiedene Lösungsansätze an und gibt an, dass Version 2 von HTML2Text (mit DOMDocument) UTF-8-Unterstützung bietet.
Beachten Sie die Einschränkungen für die kommerzielle Nutzung.
quelle
Es gibt die vertrauenswürdige Funktion strip_tags . Es ist aber nicht schön. Es wird nur desinfizieren. Sie können es mit einem String-Ersatz kombinieren, um Ihre ausgefallenen 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))); ?>
quelle
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"; }
quelle
Sie können diese Funktion testen
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); }
quelle
Ich fand keine der vorhandenen Lösungen passend - einfache HTML-E-Mails zu einfachen Nur-Text-Dateien.
Ich habe dieses Repository geöffnet und 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
quelle
Wenn Sie die HTML-Sonderzeichen konvertieren und nicht nur entfernen, sondern auch entfernen und sich auf einfachen Text vorbereiten möchten, war dies die Lösung, die für mich funktioniert hat ...
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 w / ENT_QUOTES | ENT_XML1 konvertiert Dinge wie
'
htmlspecialchars_decode konvertiert Dinge wie&
html_entity_decode konvertiert Dinge wie'<
und strip_tags entfernt alle verbleibenden HTML-Tags.quelle
Markdownify konvertiert HTML in Markdown, ein Nur-Text-Formatierungssystem, das auf dieser Site verwendet wird.
quelle
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);
Ausgabezeichenfolge
1
Zeichenfolge 2
Zeichenfolge 3
Zeichenfolge 4
Zeichenfolge 5
quelle
Ich bin auf dasselbe Problem wie das OP gestoßen, und einige Lösungen aus den obigen Top-Antworten haben sich für meine Szenarien nicht bewährt. Sehen Sie am Ende, warum.
Stattdessen fand ich dieses hilfreiche Skript, um Verwirrung zu vermeiden, nennen wir es
html2text_roundcube
, verfügbar unter GPL:Es ist tatsächlich eine aktualisierte Version eines bereits erwähnten Skripts -
http://www.chuggnutt.com/html2text.php
- aktualisiert durch RoundCube Mail.Verwendung:
$h2t = new \Html2Text\Html2Text('Hello, "<b>world</b>"'); echo $h2t->getText(); // prints Hello, "WORLD"
Warum
html2text_roundcube
erwies es sich als besser als die anderen:In
http://www.chuggnutt.com/html2text.php
Fällen mit speziellen HTML-Codes / Namen (z. B.ä
) oder ungepaarten Anführungszeichen (z<p>25" Monitor</p>
. B. ) funktionierte das Skript nicht sofort .Das Skript
https://github.com/soundasleep/html2text
hatte keine Möglichkeit, die Links am Ende des Textes auszublenden oder zu gruppieren, sodass eine normale HTML-Seite im Nur-Text-Format mit Links überfüllt aussieht. Das Anpassen des Codes für eine spezielle Behandlung der Transformation ist nicht so einfach wie das einfache Bearbeiten eines Arrays inhtml2text_roundcube
.quelle
Ich habe gerade eine PHP-Funktion "strip_tags ()" gefunden und sie funktioniert in meinem Fall.
Ich habe versucht, den folgenden HTML-Code zu konvertieren:
<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>
Nach dem Anwenden der Funktion strip_tags () habe ich die folgende Ausgabe:
&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?
quelle
Für Texte in utf-8 hat es bei mir mb_convert_encoding funktioniert. Stellen Sie sicher, dass Sie das "@" verwenden, um alles unabhängig von Fehlern zu verarbeiten.
Der grundlegende Code, den ich verwende, ist:
$dom = new DOMDocument(); @$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $body = $dom->getElementsByTagName('body')->item(0); echo $body->textContent;
Wenn Sie etwas Fortgeschritteneres wünschen, können Sie die Knoten iterativ analysieren, aber Sie werden auf viele Probleme mit Leerzeichen stoßen.
Ich habe einen Konverter implementiert, der auf dem basiert, was ich hier sage. Wenn Sie interessiert sind, können Sie es von git https://github.com/kranemora/html2text herunterladen
Es kann als Referenz dienen, um Ihre zu machen
Sie können es so verwenden:
$html = <<<EOF <p>Welcome to <strong>html2text<strong></p> <p>It's <em>works</em> for you?</p> EOF; $html2Text = new \kranemora\Html2Text\Html2Text; $text = $html2Text->convert($html);
quelle
Wenn Sie die Tags nicht vollständig entfernen und den Inhalt in den Tags behalten möchten, können Sie den Stammknoten wie folgt verwenden
DOMDocument
und extrahierentextContent
: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 besteht darin, dass keine externen Pakete erforderlich sind.
quelle