我想在h1
标记之后将HTML放入字符串,直到下一个h1
标记,然后继续。
例如,这是HTML:
<h1>Heading</h1>
<p>Paragraph</p>
<ul>
<li>List item</li>
<li>List item</li>
</ul>
<p>Paragraph</p>
<h1>Heading 2</h1>
<ul>
<li>List item</li>
<li>List item</li>
</ul>
<p>Paragraph<img /></p>
从此我想创建这个数组:
array(
0 => '<p>Paragraph</p><ul><li>List item</li><li>List item</li></ul><p>Paragraph</p>',
1 => '<ul><li>List item</li><li>List item</li></ul><p>Paragraph<img /></p>'
)
在h1
代码之后选择所有内容直到下一个内容的XPath查询是什么?依此类推?
感谢任何帮助或建议。
更新:
我最终想要实现的是,使用PHP创建一个数组格式:
array(
'headings' => array(
1 => '<h1>Heading</h1>',
2 => '<h1>Heading 2</h1>'
),
'content' => array(
1 => '<p>Paragraph</p><ul><li>List item</li><li>List item</li></ul><p>Paragraph</p>',
2 => '<ul><li>List item</li><li>List item</li></ul><p>Paragraph<img /></p>'
)
)
答案 0 :(得分:1)
这是一种快速的方法。
假设您的代码位于$code
:
$code = <<<'CODE'
<h1>Heading</h1>
<p>Paragraph</p>
<ul>
<li>List item</li>
<li>List item</li>
</ul>
<p>Paragraph</p>
<h1>Heading 2</h1>
<ul>
<li>List item</li>
<li>List item</li>
</ul>
<p>Paragraph<img /></p>
CODE;
<强>解决方案:强>
// Content array...
$content = array_map(
function ($element) {
return preg_replace('/\>\s+\</', '><', $element);
},
preg_split('/\<h1\>[^\<]*\<\/h1\>/', $code)
);
array_shift($content);
// Headings array...
preg_match_all('/\<h1\>[^\<]*\<\/h1\>/', $code, $matches);
$headings = $matches[0];
// Result
$result = array(
'headings' => $headings,
'content' => $content,
);
print_r($result);
<强>输出:强>
Array
(
[headings] => Array
(
[0] => <h1>Heading</h1>
[1] => <h1>Heading 2</h1>
)
[content] => Array
(
[0] => <p>Paragraph</p><ul><li>List item</li><li>List item</li></ul><p>Paragraph</p>
[1] => <ul><li>List item</li><li>List item</li></ul><p>Paragraph<img /></p>
)
)
答案 1 :(得分:0)
我是这样做的:)
$html = '<h1>Heading</h1><p>Paragraph</p><ul><li>List item</li><li>List item</li></ul><p>Paragraph</p><h1>Heading 2</h1><ul><li>List item</li><li>List item</li></ul><p>Paragraph<img /></p>';
$dom_document = new DOMDocument();
$dom_document->loadHTML($html);
$dom_document->preserveWhiteSpace = false;
//use DOMXpath to navigate the html with the DOM
$dom_xpath = new DOMXpath($dom_document);
$elements = $dom_xpath->query("/html/body/*");
if (!is_null($elements)) {
$i = 0;
foreach ($elements as $element) {
if ($element->nodeName == 'h1') {
$i++;
$array['headings'][$i] = $dom_document->saveHtml($element);
continue;
} else {
$array['content'][$i] .= $dom_document->saveHtml($element);
}
}
}
var_dump($array);
注意:如果您使用PHP 5.2,则替换:
$array['headings'][$i] = $dom_document->saveHtml($element);
和
$array['content'][$i] .= $dom_document->saveHtml($element);
使用:
$array['headings'][$i] = $dom_document->saveXml($element);
$array['content'][$i] .= $dom_document->saveXml($element);