2011-09-19 18 views
2

因此,我有一个PHP脚本,它接受管道电子邮件,为其添加页脚并将它们传递给它们。获取PHP中的HTML电子邮件的正文

但是,如果有人发送一个已经是HTML格式的电子邮件,它只是将整个HTML电子邮件插入到一个新的HTML文档的正文。 我需要一个脚本,将(如果电子邮件已经在HTML中)脱离html,头部和身体标签离开原来的电子邮件。

I.e.如果有人发送了一封电子邮件

<html><body>This is my awesome input email which is <strong>already</strong> in HTML</body></html> 

它是由我的脚本解析成为

<html><body><html><body>This is my awesome input email which is <strong>already</strong> in HTML</body></html></body></html> 

我怎样才能得到,如果它存在,它起飞的HTML结构?

回答

2

我不认为有可能在使用DOMDocument和HTML时检测html元素是否存在,因为如果loadHTML()不存在,它将添加它自己的html元素。

下面的代码将总是返回body元素的序列化HTML。

$dom = new DOMDocument; 

$dom->loadHTML($html); 

$body = ''; 

foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $child) { 
    $body .= $dom->saveHTML($child); 
} 

CodePad

或者,您可以将HTML视为XML并检测它,但如果没有documentElement,则可能有问题。我通过添加一个虚拟的documentElement来解决这个问题,尽管它有点笨重(我可能会自己坚持上面的代码)。

// Need a documentElement so wrap it with some generic garbage. 
$html = '<garbage>' . $html . '</garbage>'; 

$dom = new DOMDocument; 

$dom->loadXML($html); 

if ($dom->getElementsByTagName('html')->length) { 
    ... 
} 

CodePad

+0

我跑了,得到了'警告:DOMDocument :: saveHTML()期望恰好0参数,1中给出####:eval()'d代码行12' – Gricey

+0

@MitchellGrice:您是否使用旧版本的PHP?如果是这样,用'saveXML($ child,LIBXML_NOEMPTYTAG)'替换'saveHTML($ child)'。 – alex

+0

我正在使用5.2.16 您的评论中的更改完美无缺,谢谢您的帮助 – Gricey

相关问题