我需要通过选定的标签 - <p>, <ol>, <ul>, <table>, <h1-6>
来爆炸包含(无效)HTML的字符串。如果嵌套了任何标记,则字符串应仅由第一个标记分解。
插入输入:
<div id="main">
<h1 id="heading">Heading h1</h1>
<p>
<ol>
<li>abc</li>
<li>def</li>
<li>ghi</li>
</ol>
Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm.
</p>
<p>Test test test test test</p>
<ul>
<li>aaa</li>
</ul>
</div>
Exptected output:
$output[0] = '<div id="wrapp"><h1 id="heading">Heading h1</h1>';
$output[1] = '<p><ol><li>abc</li><li>def</li><li>ghi</li></ol>Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm lorem ipsum Lorem ipusm.</p>';
$output[2] = '<p>Test test test test test</p>';
$output[3] = '<ul><li>aaa</li></ul></div>';
我尝试了一些DOM库,但没有人不能满足我的需要。最大的问题是split div #main元素和嵌套标签(无效的html)。我很欣赏任何想法。
答案 0 :(得分:1)
您可以将<(p|h[1-6]|ul|ol|table)
这样的正则表达式与preg_match一起使用到find the position of your opening tag。然后使用返回的匹配来查找结束匹配。
您的代码看起来像这样
$html = "<div id="wrapp"><h1 id="heading">Heading ...";
$output = $match = array();
$regex = '<(p|h[1-6]|ul|ol|table)';
while(preg_match($regex, $html, $match, PREG_OFFSET_CAPTURE)){
$endTag = '</' . $match[1][0] '>';
$endPosition = strpos($html, $endTag)
$output[] = substr($html, 0 , $endPosition);
$html = substr($html, $endPosition + strlen($endTag));
}
请注意,此代码未经测试。