PHP:Convert<;ul>&书信电报;李>;树HTML标记到数组

PHP:Convert<;ul>&书信电报;李>;树HTML标记到数组,php,arrays,jstree,Php,Arrays,Jstree,我正在使用jsTree,我需要将这个HTML标记树代码转换为PHP数组。 jsTree HTML标记将被传递给PHP进行解析,并存储在结构化树PHP数组中(PHP数组结构见下文) 附加问题:我想要的PHP数组结构是好的还是你可以建议一个好的结构?我愿意听取建议 提前感谢:) 干杯, 标记 jsTree屏幕截图: <ul class="ltr"> <li id="phtml_1" class=" open"> <a style="" class=" " hr

我正在使用jsTree,我需要将这个HTML标记树代码
转换为PHP数组。 jsTree HTML标记将被传递给PHP进行解析,并存储在结构化树PHP数组中(PHP数组结构见下文)

附加问题:我想要的PHP数组结构是好的还是你可以建议一个好的结构?我愿意听取建议

提前感谢:)

干杯, 标记

jsTree屏幕截图

<ul class="ltr">
<li id="phtml_1" class="  open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1</a>
    <ul>
    <li class="leaf" id="phtml_2">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Child 1.1</a>
    </li>
    <li class="open" id="phtml_3">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1.1</a>
        <ul>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.1.1</a>
        </li>
        </ul>
    </li>
    <li class="last open" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Folder 1.2</a>
        <ul>
        <li class="leaf" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.1</a>
        </li>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.2</a>
        </li>
        </ul>
    </li>
    </ul>
</li>
<li id="phtml_5" class="file open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 2</a>
    <ul>
    <li class="leaf" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Child 2.1</a>
    </li>
    <li class="leaf last" rel="default">
        <a href="" style="" class="clicked"><ins>&nbsp;</ins>Child 2.2</a>
    </li>
    </ul>
</li>
<li class="leaf last" rel="default">
    <a href="" style="" class=" "><ins>&nbsp;</ins>Outer Child</a>
</li>
</ul>
<?php
$tree_array = array(
    'Folder 1' => array(
        'Child 1.1',
        'Folder 1.1' => array(
            'Child 1.1.1'
        ),
        'Folder 1.2' => array(
            'Child 1.2.1',
            'Child 1.2.2'
        ),
    ),
    'Folder 2' => array(
        'Child 2.1',
        'Child 2.2'
    ),
    'Outer Child'
);

echo '<pre>',print_r($tree_array),'</pre>';
?>
$('#saveButton').click(function() {
    var treeData = $.tree.reference($('#sortableTree')).get(undefined, 'json');
    var tmp = serializeTree(treeData, 0);
    // now json-encode tmp and submit it
});

function serializeTree(nodes, parent)
{
    var parents = {};
    var childOrder = []
    var childOrders = {};
    for(var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
        var id = node.attributes.id.substr(5); // assuming the id looks like 'abcd-ID'
        parents[id] = parent;
        childOrder.push(id);
        if(node.children)
        {
            var tmp = serializeTree(node.children, id);
            for(var id in tmp[0])
                parents[id] = tmp[0][id];
            for(var id in tmp[1])
                childOrders[id] = tmp[1][id]
        }
    }

    childOrders[parent] = childOrder;

    return [parents, childOrders];
}

HTML树字符串

<ul class="ltr">
<li id="phtml_1" class="  open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1</a>
    <ul>
    <li class="leaf" id="phtml_2">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Child 1.1</a>
    </li>
    <li class="open" id="phtml_3">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1.1</a>
        <ul>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.1.1</a>
        </li>
        </ul>
    </li>
    <li class="last open" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Folder 1.2</a>
        <ul>
        <li class="leaf" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.1</a>
        </li>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.2</a>
        </li>
        </ul>
    </li>
    </ul>
</li>
<li id="phtml_5" class="file open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 2</a>
    <ul>
    <li class="leaf" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Child 2.1</a>
    </li>
    <li class="leaf last" rel="default">
        <a href="" style="" class="clicked"><ins>&nbsp;</ins>Child 2.2</a>
    </li>
    </ul>
</li>
<li class="leaf last" rel="default">
    <a href="" style="" class=" "><ins>&nbsp;</ins>Outer Child</a>
</li>
</ul>
<?php
$tree_array = array(
    'Folder 1' => array(
        'Child 1.1',
        'Folder 1.1' => array(
            'Child 1.1.1'
        ),
        'Folder 1.2' => array(
            'Child 1.2.1',
            'Child 1.2.2'
        ),
    ),
    'Folder 2' => array(
        'Child 2.1',
        'Child 2.2'
    ),
    'Outer Child'
);

echo '<pre>',print_r($tree_array),'</pre>';
?>
$('#saveButton').click(function() {
    var treeData = $.tree.reference($('#sortableTree')).get(undefined, 'json');
    var tmp = serializeTree(treeData, 0);
    // now json-encode tmp and submit it
});

function serializeTree(nodes, parent)
{
    var parents = {};
    var childOrder = []
    var childOrders = {};
    for(var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
        var id = node.attributes.id.substr(5); // assuming the id looks like 'abcd-ID'
        parents[id] = parent;
        childOrder.push(id);
        if(node.children)
        {
            var tmp = serializeTree(node.children, id);
            for(var id in tmp[0])
                parents[id] = tmp[0][id];
            for(var id in tmp[1])
                childOrders[id] = tmp[1][id]
        }
    }

    childOrders[parent] = childOrder;

    return [parents, childOrders];
}

你应该以一种更为程序员友好的格式提交树数据,而不是与html混为一谈

<?php
    require_once( "simplehtmldom/simple_html_dom.php" );
    $DOM = file_get_html( "test.htm" );
    $ARR = array( );
    function WalkUL( $ul, &$ar )
    {
        foreach( $ul->children as $li )
        {
            if ( $li->tag != "li" )
            {
                continue;
            }
            $arar = array( );
            foreach( $li->children as $ulul )
            {
                if ( $ulul->tag != "ul" )
                {
                    continue;
                }
                WalkUL( $ulul, $arar );
            }
            $ar[ $li->find( "a", 0 )->plaintext ] = $arar;
        }
    }
    WalkUL( $DOM->find( "ul", 0 ), $ARR );
    print_r( $ARR );
?>
$(“#保存按钮”)。单击(函数(){
var treeData=$.tree.reference($('sortableTree')).get(未定义,'json');
var tmp=serializedtree(treeData,0);
//现在json编码tmp并提交它
});
函数序列化树(节点、父节点)
{
var parents={};
var childOrder=[]
var childOrders={};
对于(var i=0;i
您应该以更为程序员友好的格式提交树数据,而不是与html混为一谈

<?php
    require_once( "simplehtmldom/simple_html_dom.php" );
    $DOM = file_get_html( "test.htm" );
    $ARR = array( );
    function WalkUL( $ul, &$ar )
    {
        foreach( $ul->children as $li )
        {
            if ( $li->tag != "li" )
            {
                continue;
            }
            $arar = array( );
            foreach( $li->children as $ulul )
            {
                if ( $ulul->tag != "ul" )
                {
                    continue;
                }
                WalkUL( $ulul, $arar );
            }
            $ar[ $li->find( "a", 0 )->plaintext ] = $arar;
        }
    }
    WalkUL( $DOM->find( "ul", 0 ), $ARR );
    print_r( $ARR );
?>
$(“#保存按钮”)。单击(函数(){
var treeData=$.tree.reference($('sortableTree')).get(未定义,'json');
var tmp=serializedtree(treeData,0);
//现在json编码tmp并提交它
});
函数序列化树(节点、父节点)
{
var parents={};
var childOrder=[]
var childOrders={};
对于(var i=0;i
关于:

我的问题是我很难解析字符串HTML标记并将其保存在PHP数组中

我建议您使用HTML解析器,例如。这将允许您以您想要的方式遍历HTMLDOM

下面是一个快速而肮脏的UL行走脚本:

Array
(
    [Folder 1] => Array
        (
            [Child 1.1] => Array
                (
                )
            [Folder 1.1] => Array
                (
                    [Child 1.1.1] => Array
                        (
                        )
                )
            [Folder 1.2] => Array
                (
                    [Child 1.2.1] => Array
                        (
                        )
                    [Child 1.2.2] => Array
                        (
                        )
                )
        )
    [Folder 2] => Array
        (
            [Child 2.1] => Array
                (
                )
            [Child 2.2] => Array
                (
                )
        )
    [Outer Child] => Array
        (
        )
)
关于:

我的问题是我很难解析字符串HTML标记并将其保存在PHP数组中

我建议您使用HTML解析器,例如。这将允许您以您想要的方式遍历HTMLDOM

下面是一个快速而肮脏的UL行走脚本:

Array
(
    [Folder 1] => Array
        (
            [Child 1.1] => Array
                (
                )
            [Folder 1.1] => Array
                (
                    [Child 1.1.1] => Array
                        (
                        )
                )
            [Folder 1.2] => Array
                (
                    [Child 1.2.1] => Array
                        (
                        )
                    [Child 1.2.2] => Array
                        (
                        )
                )
        )
    [Folder 2] => Array
        (
            [Child 2.1] => Array
                (
                )
            [Child 2.2] => Array
                (
                )
        )
    [Outer Child] => Array
        (
        )
)

仅供参考:还有一个jQuery插件,用于序列化HTML DOM树和
    列表:
    -它将和
      列表的嵌套结构转换为字符串,该字符串可用作关联的php数组。

      仅供参考:还有一个jQuery插件,用于序列化和
        列表的HTML DOM树:
        -它将和
          列表的嵌套结构转换为字符串,该字符串可用作关联的php数组。

          如果您的ul不包含任何href元素(例如,纯文本nexted ul)。。我已经调整了Salman的simplehtmldom代码,以处理该问题:

          $DOM=str\u get\u html($catshtml);
          $ARR=array();
          功能步行($ul和$ar)
          {
          foreach($ul->children as$li)
          {
          如果($li->tag!=“li”)
          {
          继续;
          }
          $arar=array();
          foreach($li->children as$ulull)
          {
          如果($ulul->tag!=“ul”)
          {
          继续;
          }
          WalkUL($ulul,$arar);
          }
          $ar[trim(preg#u replace(“#]*>(.+]*>|))#is“,”,$li->innertext))]=$arar;
          }
          }
          WalkUL($DOM->find(“ul”,0),$ARR);
          回声“;印刷费($ARR);
          
          如果您的UL不包含任何href元素(例如,纯文本下一个UL)。。我已经调整了Salman的simplehtmldom代码,以处理该问题:

          $DOM=str\u get\u html($catshtml);
          $ARR=array();
          功能步行($ul和$ar)
          {
          foreach($ul->children as$li)
          {
          如果($li->tag!=“li”)
          {
          继续;
          }
          $arar=array();
          foreach($li->children as$ulull)
          {
          如果($ulul->tag!=“ul”)
          {
          继续;
          }
          WalkUL($ulul,$arar);
          }
          $ar[trim(preg#u replace(“#]*>(.+]*>|))#is“,”,$li->innertext))]=$arar;
          }
          }
          WalkUL($DOM->find(“ul”,0),$ARR);
          回声“;印刷费($ARR);
          
          也就是说,你从一段HTML开始,想以一个PHP数组结束?@Salman:是的。我正在创建一个jsTree编辑器,其中包含添加、编辑、删除、移动、复制、粘贴和重命名功能的按钮。在用户编辑之后,我需要保存HTML标记树结构。我的问题是,我很难解析字符串HTML标记并将其保存在PHP数组中。你从一段HTML开始,想以一个PHP数组结束吗?@Salman:是的。我正在创建一个jsTree编辑器,其中包含添加、编辑、删除、移动、复制、粘贴和重命名功能的按钮。在用户编辑之后,我需要保存HTML标记树结构。我的问题我很难解析字符串HTML标记并将其保存在PHP数组中。很好!:)快速的回答。你很好,先生。我现在就试试。谢谢DUm I javascript警报tmp,这是输出:[{u 1:0,{u 2:“{u 1”,“{u 3:{u 1”,“{u 5:0},{u 1:[“{u 2”,“{u 3”],0:[“{u 1”,“{u 5”}]我不明白