PHP正则表达式-正向查找后匹配多个项目

时间:2020-05-19 04:23:59

标签: php regex

我有这个HTML

<li>

我想让每个preg_match_all( '/(?<=my-list">).*(<li>.+<\/li>)/Ui', $text, $matches ); 都在“ my-list”类下,并尝试像这样使用Positive Lookbehind:

<li>

但是我只能这样得到第一个array( 0 => array(1 0 => <li>Item1</li> ) )

array(1
  0 => array(1
    0 => <li>Item1</li>
    1 => <li>Item2</li>
    2 => <li>Item3</li>
  )
)

如何获取每个列表项?预期结果:

{{1}}

谢谢

2 个答案:

答案 0 :(得分:2)

您实际上应该使用解析器:

<?php

$data = <<<HTML
<ul class="my-list"><li>Item1</li><li>Item2</li><li>Item3</li></ul>

<ul class="other-list"><li>ItemA</li><li>ItemB</li><li>ItemC</li></ul>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($data);

$xpath = new DOMXPath($dom);
foreach ($xpath->query("//ul[@class = 'my-list']/li") as $node) {
#                                             ^^^
    echo $node->nodeValue . "\n";
}

?>

哪个产量

Item1
Item2
Item3

请参见here for more information。另外,this project看起来也很有趣。


至于更改(编辑)值,只需更改几行:

$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 
# removes the doctype string

然后更改,例如元素的节点值,然后将其输出:

$xpath = new DOMXPath($dom);
foreach ($xpath->query("//ul[@class = 'my-list']/li") as $node) {
    $node->nodeValue .= "###";
}

$dom->formatOutput = true;
echo $dom->saveHTML();

这将产生

<ul class="my-list">
<li>Item1###</li>
<li>Item2###</li>
<li>Item3###</li>
<ul class="other-list">
<li>ItemA</li>
<li>ItemB</li>
<li>ItemC</li>
</ul>
</ul>

答案 1 :(得分:0)

$text='<ul class="my-list"><li>Item1</li><li>Item2</li><li>Item3</li></ul>

<ul class="other-list"><li>ItemA</li><li>ItemB</li><li>ItemC</li></ul>';

preg_match( '/<ul class="my-list">(.*?)<\/ul>/i', $text, $matches );
preg_match_all( '/(<li>.+<\/li>)/Ui', $matches[0], $matches1 );

var_dump($matches1[0]);

结果:

array(3) {
  [0]=>
  string(14) "<li>Item1</li>"
  [1]=>
  string(14) "<li>Item2</li>"
  [2]=>
  string(14) "<li>Item3</li>"
}