XPath - 选择特定标签后的所有内容

4

我正在尝试将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>'
)

什么是用于选择

标签之后的所有内容直到下一个标签的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>'
  )
)


我认为这可以帮助你:https://dev59.com/kHM_5IYBdhLWcg3wrFIt - cacoroto
2个回答

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>
        )
)

谢谢您。这有助于提高我的正则表达式技能 :) - beingalex

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接