我试图弄清楚这在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 ) ) ;
}