↓以下代码通过GPL v3开源协议授权↓
<?php
if(!function_exists('html_to_obj')){
/**
* 此函数将HTML字符串作为参数,并将其转换为DOMDocument对象。
* 然后使用element_to_obj()函数将DOMDocument对象转换为关联数组。
* 最后可以用json_encode()函数将数组变成JSON数据。
*
* 注意:如果输入的HTML不带``标签的话,会自动补全。
* 如果只想要``里的内容,请取结果中的['children'][0]['children']。
*
* @param string $html HTML代码
* @param bool $return_object 返回对象?
* @return array|object 包含HTML数据的数组或对象
*/
function html_to_obj($html,$return_object = false) {
$dom = new DOMDocument();
$XML_HEADER = '<' . '?' .'xml encoding="UTF-8">';
$dom->loadHTML($XML_HEADER. $html,LIBXML_NOERROR); //某些HTML5标签会导致错误发生,用LIBXML_NOERROR压制错误
if($return_object) {
return $dom;
} else {
return element_to_obj($dom->documentElement);
}
}
/**
* 将HTML对象转换为数组。
* @param DOMDocument|object $element 要转换的包含HTML数据的对象。
* @return array 表示HTML元素的关联数组。
*/
function element_to_obj($element) {
//var_dump($element);
//echo $element->tagName, "\n";
$obj = array( "tag" => $element->tagName );
foreach ($element->attributes as $attribute) {
$obj[$attribute->name] = $attribute->value;
}
foreach ($element->childNodes as $subElement) {
if ($subElement->nodeType == XML_TEXT_NODE) {
if (in_array($element->tagName,array('b', 'big', 'i', 'small', 'tt','abbr', 'acronym', 'cite', 'code', 'dfn', 'em', 'kbd', 'strong', 'samp', 'var','bdo', 'br', 'q', 'span', 'sub', 'sup'
))) {
$obj["html"] = $subElement->wholeText;
} else {
if($subElement->wholeText == "\r\n") {
continue;
} else {
$obj["children"][] = array('tag' => 'txt','html' => $subElement->wholeText);
}
}
} elseif ($subElement->nodeType == XML_CDATA_SECTION_NODE) {
$obj["html"] = $subElement->data;
}
else {
$obj["children"][] = element_to_obj($subElement);
}
}
return $obj;
}
}
?>
↑以上代码通过GPL v3开源协议授权↑
用法:
<?php
//最终的帖子内容——HTML解析成JSON
$_post_message_full = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');
// if a element that is not in the above list is empty,
// it should close like `<element></element>` (for eg. empty `<title>`)
return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}></{$matches[1]}>";
}, $_post_message_full);
$thread['message_fmt'] = html_to_obj($_post_message_full)['children'][0]['children'];
?>