HTML zu Plain-Text umwandeln
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
alt text
code
dank
dom
entfernen
format
funktion
http
idee
match
normaler text
reinem text
run
string
teil
text
treffer
umwandeln
url
vorliegen
-
Hallo
ich möchte HTML-Code zu Plain-Text umwandeln
zum Zweck ... Emails die nur im HTML-Format vorliegen zu reinem Text machen.
ich habe auch schon eine Funktion dazu gebastelt.
// ------------------------------------------------------------------ function strip_html_tags($htmlcode) { // ---- Zeilenumbruch und Tabs entfernen ---- $htmlcode = str_replace("\r", '', $htmlcode); $htmlcode = str_replace("\t", ' ', $htmlcode); // ---- HTML-TAGs zu Plain-Text ---- $string = preg_replace ('/<[^>]*>/', ' ', $htmlcode); $string = str_replace(' ', ' ', $string); $string = html_entity_decode($string); // ---- Mehrfach Leerzeichen entfernen ---- $string = preg_replace('/ {2,}/', ' ', $string); // ---- Mehrfach Zeilenumbruch entfernen ---- ## $string = str_replace("\n ", "\n", $string); ## $string = str_replace(" \n", "\n", $string); ## $string = preg_replace("/\n\n{2,}/", "\n", $string); $string = trim($string); return $string; } // ------------------------------------------------------------------
Diese Funktion funktioniert zwar ganz gut, ...
... die mit ## aus-kommentierten Teile sind optional (nicht so wichtig)
der entscheidente Teil ist wohl der Teil: "HTML-TAGs zu Plain-Text"
... aber wenn im HTML auch LInks sind, dann verschwinden die natürlich auch,
ich hätte aber gerne was, dass mir die Link-URLs bei-behält.
Beispiel:
<p> Das ist normaler <strong>Text</strong> und jetzt kommt ein Link <a href="http://www.google.de">Klick mich</a> dazu</p>
gibt bisher:
Das ist normaler Text und jetzt kommt ein Link Klick mich dazu
ich hätte gerne sowas in der Art:
Das ist normaler Text und jetzt kommt ein Link [Klick mich] http://www.google.de dazu
es muss nicht exact diese Form haben, hauptsache Link-Text und Link-URL erkennbar.
Problem wird dabei auch sein, wenn im HTML ein <img> als Link ist
dann könnte man den Alt-Text als [Link-Text] nehmen,
aber das setzt voraus, das der <img> Tag auch ein alt-Text hat.
... wie gesagt,
das Ziel ist es Emails die nur in HTML vorliegen zu reinem Text umwandeln,
dabei sollen aber Link-URLs (zumindest von Text-Link) erhalten bleiben.
jemand ne Idee ? ... andere Lösung für "Email HTML-Code zu Plain-Text" ?
Beitrag zuletzt geändert: 15.10.2013 14:43:13 von smartweb -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Jupp, eine Idee hätte ich.
Wie wäre es die HTML-Mails gleich als Plain-Text zu schreiben?
Verstehe ich das so, dass du die E-Mails schon bei dir rumliegen hast und sie jetzt für Geräte, die kein HTML verstehen, umschreiben willst?
Alles andere begreife ich sonst nicht, denn einfacher wäre es die E-Mails als reine Textmails zu schreiben.
Du merkst nämlich schon selber, dass es da nicht nur einen sondern etliche Probleme gibt, die du beim Filtern der Tags erst einmal umschreiben musst.
A HREF sind gekapselte Tags, da wird es umso komplizierter diese zu zerlegen, wenn du an die wichtigen Infos heran willst.
Deine Aktion "HTML-TAGs zu Plain-Text" killt diese Links natürlich.
Also musst du vor dieser Aktion sämtliche A HREFs finden und befreien.
Du könntest, sofern der Aufbau immer gleich ist, nach "<a href=" suchen und löschen bzw. mit " " ersetzen.
Oder du schreibst dir eine separate Funktion für die A HREFs.
Allerdings liest diese Funktion dann den HTML-Code zeilenweise ein.
Bei einem Treffer, wenn du ein "<a href" gefunden hast, verwendest du folgende Funktionen
- substr
- strrpos
um die Bereich nach z.B. Anführungszeichen und ">" zu suchen und dann alles außer der URL und der Beschreibung zu löschen. -
Vergiss die RegExen, die sind nicht für XML/HTML gedacht. Du solltest eher den DOM nutzen, denn damit bekommst du in jedem Fall ein richtiges Ergebnis.
Eventuell hilft es dir ja diesen Code anzusehen, der parst Beiträge von lima-city und gibt sie als XML aus. Wenn du das entsprechend änderst bekommst du statt XML deinen Text… -
Hallo
@kgreen .... nein ich schreibe die Emails nicht selber,
ich will Emails von anderen empfangen und wenn nur HTML dann umwandeln,
leider haben einige Absender keine SubTypes mit PLAIN Text sondern nur HTML.
ich habe jetzt mit einer neuen Funktion eine Lösung die funktioniert.
dabei werden alle Link-Inhalte, egal ob Text, HTML oder IMG zu reinem Text umgewandelt.
mein Script sieht jetzt so aus:
<?php // ------------------------------------------------------- header("Content-Type: text/html; charset=utf-8"); // ------------------------------------------------------- $readfile = 'data/_email_id_1234.htm'; // --- Nachricht im HTML-Format $fcontent = file_get_contents($readfile); // ------------------------------------------------------- function strip_html_links($matches) { $i=0; foreach($matches[2] as $linkinhalt) { $findmich = '<img'; if (stripos($linkinhalt, $findmich) !== false) { preg_match('/alt=["|\'](.*)["|\']/Uis', $linkinhalt, $imatches); $matches[2][$i] = '[IMG] '.$imatches[1]; } else { $matches[2][$i] = '[TXT] '.strip_html_tags($linkinhalt); } $i++; } return $matches; } // ------------------------------------------------------- function strip_html_tags($htmlcode) { // ---- Zeilenumbruch und Tabs entfernen ---- $htmlcode = str_replace("\r", '', $htmlcode); $htmlcode = str_replace("\t", ' ', $htmlcode); // ---- HTML-TAGs zu Plain-Text ---- $string = preg_replace ('/<[^>]*>/', ' ', $htmlcode); $string = str_replace(' ', ' ', $string); $string = html_entity_decode($string); // ---- Mehrfach Leerzeichen entfernen ---- $string = preg_replace('/ {2,}/', ' ', $string); // ---- Mehrfach Zeilenumbruch entfernen ---- $string = str_replace("\n ", "\n", $string); $string = str_replace(" \n", "\n", $string); $string = preg_replace("/\n\n{2,}/", "\n", $string); $string = trim($string); return $string; } // ------------------------------------------------------- // ------------------------------------------------------- // ---- RUN (1) ... finde alle Links im HTML-Code als Treffer ---- $pattern = '°<a[^>]+href[^>]*=[^>]*["|\']([^"\']+)["|\'][^>]*>(.*)<\/a>°Uis'; preg_match_all($pattern,$fcontent,$matches); // ------------------------------------------------------- // ---- RUN (2) ... ersetzte Links in Treffer zu Plain-Text ---- $matches = strip_html_links($matches); // ------------------------------------------------------- // ---- RUN (3) ... ersetzte alle Links im HTML-Code zu Plain-Text ---- $z=0; foreach($matches[0] as $linkcode) { $replace = '# LINK: '.$matches[2][$z].' URL: '.$matches[1][$z].' #'; $fcontent = str_replace($matches[0][$z], $replace, $fcontent); $z++; } // ------------------------------------------------------- // ---- RUN (4) ... ersetzte den restlichen HTML-Code zu Plain-Text ---- $fcontent = strip_html_tags($fcontent); // ------------------------------------------------------- // ------------------------------------------------------- print '<br />'."\n"; print '<br />'."\n"; print '<br />'."\n"; // ---- DEBUG --- fertiger TEXT mit Links als Plain-Text ---- print '<pre style="margin:18px 6px; padding:4px; text-align:left; background:#DEDEDE; color:#000099;">'."\n"; print htmlentities(print_r($fcontent, true))."\n"; print '</pre>'."\n"; print '<br />'."\n"; print '<br />'."\n"; print '<br />'."\n"; // ---- DEBUG --- alle Link-Treffer aus HTML-Code ---- print '<pre style="margin:18px 6px; padding:4px; text-align:left; background:#DEDEDE; color:#000099;">'."\n"; print htmlentities(print_r($matches, true))."\n"; print '</pre>'."\n"; print '<br />'."\n"; print '<br />'."\n"; print '<br />'."\n"; // ------------------------------------------------------- ?>
das funktioniert soweit ... hab aber noch nicht viel damit getestet.
-------------------------------------
@hackyourlife ... ja Danke, gute Idee das mit DOM zu machen, ist evtl performanter,
aber mit DOM habe ich noch so gut wie keine Erfahrung,
werde mir das (Prinzip) erstmal genau ansehen.
bzw wie ich diese Funktion(en) einsetzen kann.
habe auch schon an simplexml gedacht, um die Inhalte aus HTML zu verarbeiten
aber - genauso wie mit DOM - muss dazu der HTML-Code "sauber" verschachtelt sein,
und ich habe auf die Quelle keinen Einfluss, wenn "schlechtes" HTML ... dann Error ?!
Danke für den Link zu github ... damit werde ich jetzt mal versuchen, wie es / was geht.
Bis dahin funktioniert "mein Script" mit dem "RegEx" Gedöns ja schonmal,
oder findet jemand darin noch einen (gravierenden) Denk-Fehler oder Biug ... ?!
-
probier mal strip_tags(), siehe http://php.net/manual/de/function.strip-tags.php
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage