将UL LI嵌套到PHP数组-数组中的输出不正确
这是我昨天问题的后续内容--我几乎成功地将HTML块转换为数组,尽管有一个小问题我无法解决。当处理下面的HTML块时,输出数组不完全符合输入的内容(我看不出哪里出了问题,需要一双新眼睛!!) 我已包括以下项目:将UL LI嵌套到PHP数组-数组中的输出不正确,php,arrays,recursion,tree,html-lists,Php,Arrays,Recursion,Tree,Html Lists,这是我昨天问题的后续内容--我几乎成功地将HTML块转换为数组,尽管有一个小问题我无法解决。当处理下面的HTML块时,输出数组不完全符合输入的内容(我看不出哪里出了问题,需要一双新眼睛!!) 我已包括以下项目: HTML块 PHP函数与处理 输出 HTML块 基本上采取以下形式: -A -B -C ---- -D -E -F ---- -G -H -I -A -B -C -D ---- -E -F -G ---- -H
- HTML块
- PHP函数与处理
- 输出
-A
-B
-C
----
-D
-E
-F
----
-G
-H
-I
-A
-B
-C
-D
----
-E
-F
-G
----
-H
-I
详情如下:
<li>
<ul>
<li>A</li>
<li>
<ul>
<li>B</li>
<li>
<ul>
<li>C</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>D</li>
<li>
<ul>
<li>E</li>
<li>
<ul>
<li>F</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>G</li>
<li>
<ul>
<li>H</li>
<li>
<ul>
<li>I</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
Array
(
[0] => Array
(
[0] => <li>A</li>
[1] => Array
(
[0] => <li>B</li>
[1] => Array
(
[0] => <li>C</li>
)
[2] => <li>D</li>
)
[2] => Array
(
[1] => <li>E</li>
[2] => Array
(
[1] => <li>F</li>
)
[3] => <li>G</li>
)
[3] => Array
(
[2] => <li>H</li>
[3] => Array
(
[2] => <li>I</li>
)
)
)
)
详情如下:
<li>
<ul>
<li>A</li>
<li>
<ul>
<li>B</li>
<li>
<ul>
<li>C</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>D</li>
<li>
<ul>
<li>E</li>
<li>
<ul>
<li>F</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<ul>
<li>G</li>
<li>
<ul>
<li>H</li>
<li>
<ul>
<li>I</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
Array
(
[0] => Array
(
[0] => <li>A</li>
[1] => Array
(
[0] => <li>B</li>
[1] => Array
(
[0] => <li>C</li>
)
[2] => <li>D</li>
)
[2] => Array
(
[1] => <li>E</li>
[2] => Array
(
[1] => <li>F</li>
)
[3] => <li>G</li>
)
[3] => Array
(
[2] => <li>H</li>
[3] => Array
(
[2] => <li>I</li>
)
)
)
)
数组
(
[0]=>阵列
(
[0]=>A
[1] =>阵列
(
[0]=>B
[1] =>阵列
(
[0]=>C
)
[2] =>D
)
[2] =>阵列
(
[1] =>E
[2] =>阵列
(
[1] =>F
)
[3] =>G
)
[3] =>阵列
(
[2] =>H
[3] =>阵列
(
[2] =>I
)
)
)
)
感谢您的时间-如果您能帮助您正确输出阵列,我们将不胜感激 下面是一个解析HTML的工作示例,使用此处提供的DOMDocument和domNodeToArray()函数将其转换为数组: HTML不需要格式良好
// $inputHTML is your HTML-list as a string
// this is necessary to prevent DOMDocument errors on HTML5-elements
libxml_use_internal_errors(true);
$dom = new DOMDocument();
// UTF-8 hack, to correctly handle UTF-8 through DOMDocument
$dom->loadHTML('<?xml encoding="UTF-8">' . $inputHTML);
// get the first list-element in the HTML-document
$listAsDom = $dom->getElementsByTagName('ul')->item(0);
// print it out as array
var_dump(domNodeToArray($listAsDom));
/**
* Transforms the contents of a DOMNode to an associative array
* @author Marc Ermshaus
* http://www.ermshaus.org/2010/12/php-transform-domnode-to-array
*
* @param DOMNode $node DOMDocument node
* @return mixed Associative array or string with node content
*/
function domNodeToArray(DOMNode $node) {
$ret = '';
if ($node->hasChildNodes()) {
if ($node->firstChild === $node->lastChild
&& $node->firstChild->nodeType === XML_TEXT_NODE
) {
// Node contains nothing but a text node, return its value
$ret = trim($node->nodeValue);
} else {
// Otherwise, do recursion
$ret = array();
foreach ($node->childNodes as $child) {
if ($child->nodeType !== XML_TEXT_NODE) {
// If there's more than one node with this node name on the
// current level, create an array
if (isset($ret[$child->nodeName])) {
if (!is_array($ret[$child->nodeName])
|| !isset($ret[$child->nodeName][0])
) {
$tmp = $ret[$child->nodeName];
$ret[$child->nodeName] = array();
$ret[$child->nodeName][] = $tmp;
}
$ret[$child->nodeName][] = domNodeToArray($child);
} else {
$ret[$child->nodeName] = domNodeToArray($child);
}
}
}
}
}
return $ret;
}
/$inputHTML是一个字符串形式的HTML列表
//这对于防止HTML5元素上的DOMDocument错误是必要的
libxml\u使用\u内部错误(true);
$dom=新的DOMDocument();
//UTF-8黑客,通过DOMDocument正确处理UTF-8
$dom->loadHTML('.$INPUTTML);
//获取HTML文档中的第一个列表元素
$listAsDom=$dom->getElementsByTagName('ul')->项(0);
//将其打印为数组
var_dump(domNodeToArray($listAsDom));
/**
*将DOMNode的内容转换为关联数组
*@作者马克·厄姆肖斯
* http://www.ermshaus.org/2010/12/php-transform-domnode-to-array
*
*@param DOMNode$node DOMDocument node
*@return具有节点内容的混合关联数组或字符串
*/
函数domnodetorarray(DOMNode$node){
$ret='';
如果($node->hasChildNodes()){
如果($node->firstChild===$node->lastChild
&&$node->firstChild->nodeType==XML\u TEXT\u节点
) {
//节点只包含文本节点,返回其值
$ret=修剪($node->nodeValue);
}否则{
//否则,执行递归
$ret=array();
foreach($node->childNodes作为$child){
if($child->nodeType!==XML\u TEXT\u节点){
//如果服务器上有多个具有此节点名称的节点
//当前级别,创建一个数组
如果(isset($ret[$child->nodeName])){
如果(!是数组($ret[$child->nodeName])
||!isset($ret[$child->nodeName][0])
) {
$tmp=$ret[$child->nodeName];
$ret[$child->nodeName]=array();
$ret[$child->nodeName][]=$tmp;
}
$ret[$child->nodeName][]=domNodeToArray($child);
}否则{
$ret[$child->nodeName]=domNodeToArray($child);
}
}
}
}
}
返回$ret;
}
如果你的列表总是格式良好,你可以用它来做你想做的事情。它使用,因此不会原谅输入代码中的错误和不良形式。如果你想原谅别人,你需要使用——代码会稍微复杂一点,但不是可笑的复杂一点
function ul_to_array ($ul) {
if (is_string($ul)) {
if (!$ul = simplexml_load_string("<ul>$ul</ul>")) {
trigger_error("Syntax error in UL/LI structure");
return FALSE;
}
return ul_to_array($ul);
} else if (is_object($ul)) {
$output = array();
foreach ($ul->li as $li) {
$output[] = (isset($li->ul)) ? ul_to_array($li->ul) : (string) $li;
}
return $output;
} else return FALSE;
}
如果你用a,那就容易多了。你是什么意思?HTML在我看来是有效的(我知道没有打开或关闭
- ,但如果它们在那里,它就没有开始处理它)。我这样做的原因是我可以处理
- 项的内容-在这里我需要使用regex,除其他外…这不是最有用的评论,但我会在这里回应Gumbo。我做了一个类似的事情,我将一个HTML表解析成一个csv文件,simplexml非常出色,唯一的问题是我必须首先确保HTML格式正确,但这只是一个剥离所有属性并确保所有标记都是小写的问题。@dartacus
-真的吗?只是如果您能够很好地解析字符串并保证准确度,那么您就不能在同一个过程中构建您的CSV表吗?@DaveRandom您会这么想,不是吗?在我的内容作者开始制作csv或xls文件供人们直接下载之前,这是一个临时解决方案。您可以在这里看到一个示例:(在底部,“有效条目”)标准实践是在答案中实际包含有用的代码。。。为什么只是剥离所有属性并确保所有标记都是小写的问题
函数中没有代码?@DaveRandom我假设它与上列出的函数相同,但也许你是对的here@feeela我尝试了一下,但只返回了前3个条目,而不是全部9@MrJ也就是说,我猜,因为您在上面的代码中使用了它。domnodetarray()
引用第一个$dom->getElementsByTagName('ul')->项(0)
标记,在上面的示例中,该标记仅包含前三个元素。如果将字符串包装在
中,它应该执行预期的操作。费埃拉,你应该发tif (!$ul = simplexml_load_string($ul)) {