在PHP中仅获取HTML电子邮件的正文

在PHP中仅获取HTML电子邮件的正文,php,regex,email,Php,Regex,Email,所以我有一个PHP脚本,它接收管道发送的电子邮件,给它们添加一个页脚,并将它们传递下去 但是,如果有人发送一封已经是HTML格式的电子邮件,它只会将整个HTML电子邮件插入到新HTML文档的正文中。 我需要一个脚本,将(如果电子邮件已经在HTML中)去掉HTML,头和身体标签离开原来的电子邮件 例如,如果有人发送电子邮件 <html><body>This is my awesome input email which is <strong>already<

所以我有一个PHP脚本,它接收管道发送的电子邮件,给它们添加一个页脚,并将它们传递下去

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

例如,如果有人发送电子邮件

<html><body>This is my awesome input email which is <strong>already</strong> in HTML</body></html>
这是我非常棒的输入电子邮件,已经是HTML格式的
它被我的脚本解析为

<html><body><html><body>This is my awesome input email which is <strong>already</strong> in HTML</body></html></body></html>
这是我非常棒的输入电子邮件,已经是HTML格式的

如果HTML结构存在,我如何才能让它去掉它?

我认为在使用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);
}

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

//需要一个documentElement,所以用一些通用垃圾将其包装起来。
$html=''$html",;
$dom=新的DOMDocument;
$dom->loadXML($html);
如果($dom->getElementsByTagName('html')->长度){
...
}

?如果是这样,请将
saveHTML($child)
替换为
saveXML($child,LIBXML\u NOEMPTYTAG)
。我使用的是5.2.16,您的评论中的更改非常有效,谢谢您的帮助
// 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) {
   ...
}