使用PREG将文本中的特定HTML标记拆分为块

时间:2017-04-23 14:40:53

标签: php joomla

我试图弄清楚这在PHP中是否完全可行。我已经编写了一些代码,这些代码已经实现了我所能实现的目标,但代码相当多,而且我非常确定某种preg表达式可能会做得更好目前,我的代码在我的文本的每个字母上都有一个for循环。

以下是我想要实现的目标,我已经看过很多选项,但似乎没有完全符合我的要求,大多数人都说不要使用PREG来解析HTML,我也看过DOM和SimpleXML但是这些并不能真正给我提供选择。

我使用Joomla和K2和Joomla / K2允许我在一个类别的字段中输入描述。现在我想根据HTML标记将该描述分为三个部分。在$ h1变量中我想要的任何H1,$ h2变量中的H2和$ p变量中$ p的任何东西。这也包括任何子标签,例如,如果我在描述中有以下html

    <h1 class="title" >This title <b>with other tags</b></h1>
    <h2 class="someclass">secondary title <i>also with tags</i></h2>
    <p class="anotherclass" data-block="somedata">
    This is a text description <a href="#">with links</a> and more</p>
    <p>more P tags</p>

我确实尝试过simpleXML但删除了所有不符合我想要的标签,因为我只希望它被h1,h2或p拆分。我认为PREG会起作用,但我不确定如何让它工作我知道基本上我需要使用类似preg_split的东西并要求它首先检索&lt; h1 *&lt; / h1&gt; (*是一个通配符,但我知道在preg *中不是通配符)然后与&lt; h2 *&lt; / h2&gt;相同和&lt; p *&lt; / p&gt;目前这是我已经拥有的功能,但它似乎只是为了做一件小事而做了很多代码

    function splitHtml ( $html ) 
    {
        $in_h2 = false ;
        $in_h1 = false ;
        $in_p = false ;
        $h1 = '' ;
        $h2 = '' ;
        $p = '' ;
        for ( $i = 0 ; $i < strlen ( $html ) ; $i++ )
        {
            if ( $html[$i] == '<' )
            {
                if ( $html[$i+1] == 'h' && $html[$i+2] == '2' )
                    $in_h2 = true ;
                if ( $html[$i+1] == 'h' && $html[$i+2] == '1' )
                    $in_h1 = true ;
                if ( $html[$i+1] == 'p' )
                    $in_p = true ;
                if ( $html[$i+1] == '/' )
                {              
                    if ( $html[$i+2] == 'h' && $html[$i+3] == '2' )
                    {
                       $in_h2 = false ;
                       $h2 .= '</h2>' ;
                    }
                    if ( $html[$i+2] == 'h' && $html[$i+3] == '1' )
                    {
                       $in_h1 = false ;
                       $h1 .= '</h1>' ;
                    }
                    if ( $html[$i+2] == 'p' )
                    {
                        $in_p = false ;
                        $p .= '</p>' ;
                    }
                }
            }
            if ( $in_h1 )
                $h1 .= $html[$i] ;
            if ( $in_h2 )
                $h2 .= $html[$i] ;
            if ( $in_p )
                $p .= $html[$i] ;
        }
        return ( array ( 'h1' => $h1, 'h2' => $h2, 'p' => $p ) ) ;
    }

0 个答案:

没有答案