Php:正则表达式 - 如何提取匹配的多个部分并将其存储在数组中?

时间:2017-03-09 15:47:08

标签: php regex

我有一个包含以下代码的页面: -

<ul class="food">
<li>
<i>Bread and Butter</i>
</li>
<li>
<i>Cheese</i>
</li>
<li>
<i>Milk</i>
</li>
</ul>
<ul class="fruits">
<li>
<i>Apple</i>
</li>
<li>
<i>Mango</i>
</li>
<li>
<i>Strawberry</i>
</li>
</ul>

有两个无序列表,我想要的是斜体标记之间的内容,每个无序列表都在一个数组中。例如,Apple,Mango和Strawberry,它们是第二个无序列表的内容,应该存储在一个数组中,比如array [1],其他无序列表的内容应该存储在array [0]中。 任何无序列表中的项目数也是可变的或事先不知道,这是另一个问题。 我试过的正则表达式是

<ul class=".*">\s(?:<li>\s<i>(.*)<\/i>\s<\/li>)+<\/ul>

除了那个正则表达式之外,我整天都尝试了很多其他的,但没有成功。我是正则表达式和PHP的新手,并没有太多的想法。有人可以帮我弄这个吗? 编辑:我只允许使用正则表达式来获取内容。不允许解析

1 个答案:

答案 0 :(得分:0)

拆分完整字符串:

/<ul.*?>/m

然后遍历拆分并应用以下正则表达式来捕获斜体值“

/<i>(.*?)<\/i>/m

Run it here

的Src:

<?php

$re = '/<ul.*?>/m';
$re1 = '/<i>(.*?)<\/i>/m';
$str = '<ul class="food">
<li>
<i>Bread and Butter</i>
</li>
<li>
<i>Cheese</i>
</li>
<li>
<i>Milk</i>
</li>
</ul>
<ul class="fruits">
<li>
<i>Apple</i>
</li>
<li>
<i>Mango</i>
</li>
<li>
<i>Strawberry</i>
</li>
</ul>';

$list=preg_split($re,$str);
for($i=1;$i<count($list);$i++)
{
    preg_match_all($re1, $list[$i], $matches);
    print_r($matches[1]);
}
?>

示例输出:

Array
(
    [0] => Bread and Butter
    [1] => Cheese
    [2] => Milk
)
Array
(
    [0] => Apple
    [1] => Mango
    [2] => Strawberry
)