3

我有这个 HTML 模板:

<div>
  <p class="ex-fr">Tex1 - Edit</p>

  Out Text 1 Edit

  <p>Tex2 - Edit</p>

  Out Text 1 Edit

  <br>

  Out Text 3 Edit

</div>

我想创建一个页面来编辑此模板的文本和标签属性。

为此,我需要将此 html 解析为 php 数组并加载页面。

这是一个假设的数组,我可以从上面写的 html 中得到:

$parsedHtml = array(
        'thisIs'=>'tag',
        'tag' => 'div',
        'attr' => '',
        'children'=> array(
            0 => array(
                'thisIs'=>'tag',
                'tag' => 'p',
                'attr' => 'class="ex-fr"',
                'children'=> array(
                    'thisIs'=>'text',
                    'tag' => '',
                    'attr' => '',
                    'children'=> 'Tex1 - Edit'
                )
            ),
            1 => array(
                'thisIs'=>'text',
                'tag' => '',
                'attr' => '',
                'children'=> 'Out Text 1 Edit'
            ),
            2 => array(
                'thisIs'=>'tag',
                'tag' => 'p',
                'attr' => '',
                'children'=> array(
                    'thisIs'=>'text',
                    'tag' => '',
                    'attr' => '',
                    'children'=> 'Tex2 - Edit'
                )
            ),
            3 => array(
                'thisIs'=>'text',
                'tag' => '',
                'attr' => '',
                'children'=> 'Out Text 2 Edit'
            ),
            4 => array(
                'thisIs'=>'sTag',
                'tag' => 'br',
                'attr' => '',
                'children'=> ''
            ),
            5 => array(
                'thisIs'=>'text',
                'tag' => '',
                'attr' => '',
                'children'=> 'Out Text 3 Edit'
            )

        )

    );

目前我已经尝试使用这个类: https ://code.google.com/p/php-html2array/downloads/detail?name=class.htmlParser.php 问题是该类只返回标签,而没有标签的文本应该被忽略,如“Out Text 1 Edit”或“Out Text 2 Edit”

所以给定的数组是

(
[-{}-2-0-{}-] => Array
    (
        [id] => -{}-2-0-{}-
        [father] => 
        [tag] => div
        [innerHTML] =>  <p class='ex-fr'>Tex1 - Edit</p> Out Text 1 Edit <p>Tex2 - Edit</p> Out Text 1 Edit <br> Out Text 3 Edit 
        [htmlText] => <div > <p class='ex-fr'>Tex1 - Edit</p> Out Text 1 Edit <p>Tex2 - Edit</p> Out Text 1 Edit <br> Out Text 3 Edit </div>
        [stratr] => 
        [childNodes] => Array
            (
                [0] => Array
                    (
                        [id] => -{}-1-0-{}-
                        [father] => -{}-2-0-{}-
                        [tag] => p
                        [innerHTML] => Tex1 - Edit
                        [htmlText] => <p class='ex-fr'>Tex1 - Edit</p>
                        [stratr] =>  class='ex-fr'
                        [childNodes] => Array
                            (
                            )

                    )

                [1] => Array
                    (
                        [id] => -{}-1-1-{}-
                        [father] => -{}-2-0-{}-
                        [tag] => p
                        [innerHTML] => Tex2 - Edit
                        [htmlText] => <p>Tex2 - Edit</p>
                        [stratr] => 
                        [childNodes] => Array
                            (
                            )

                    )

                [2] => Array
                    (
                        [id] => -{}-0-0-{}-
                        [father] => -{}-2-0-{}-
                        [tag] => br
                        [innerHTML] => <br>
                        [htmlText] => <br>
                        [stratr] => 
                        [childNodes] => Array
                            (
                            )

                    )

            )

    )

)

任何想法将 html 解析为数组?(我已经搜索了浏览器如何解析 html 代码并将其显示在控制台中,例如 chrome 或 firebug,它们允许编辑)

我知道用正则表达式解析 html 很难或不可能,还有其他解决方案吗?

提前谢谢大家,对不起我的英语不好

最好的问候安德里亚。

4

2 回答 2

0

如果您熟悉jQuery,则可以使用phpQuery - 它基本上是 php 端口。简单,相当快,并且有据可查。

于 2013-08-05T16:46:41.197 回答
0

感谢您的建议,我已经制作了您可以在下面看到的功能。

它不会给我我想要的东西,但它是一个很好的起点。当我有最终的解决方案时,我会为你们发布感谢 agine 的帮助。

function parseHtml( $parent ){

    foreach( pq( $parent )->contents() as $children ){
        echo '<br>';
        $a = isset( $children->tagName );
        if( $a ){
            echo htmlentities( '<' . $children->tagName . '>' );

        }else{
            echo '<br>';
            echo '"' . htmlentities( $children->textContent ) . '"';
            echo '<br>';
        }


        parseHtml( $children );

        if( $a ){
            echo htmlentities( '</' . $children->tagName . '>' );

        }

     }

}
于 2013-08-06T10:54:49.810 回答