我有这个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}}
谢谢
答案 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>"
}