RegEx - 捕获多个项目

时间:2011-05-28 16:07:18

标签: php regex

我有这个文本块

[block]
     [item]catch me[/item]
     [item]catch me[/item]
     [item]catch me[/item]
[/block]

项目数量是可变的。现在我希望匹配每个“抓住我”,最好是在一个数组中。我有一个表达式,但这只会匹配最后一项:

\[block\](?:\s*\[item\](.*?)\[/item\]\s*)+\[/block\]

有什么想法吗?

谢谢&问候, 亚历

2 个答案:

答案 0 :(得分:3)

您没有显示如何使用表达式。你必须使用preg_match_all(),你也可以简化你的表达:

// assuming $str contains the text to match
preg_match_all("#\[item\](.*?)\[/item\]#", $str, $matches);
print_r($matches);

给出

Array
(
    [0] => Array
        (
            [0] => [item]catch me[/item]
            [1] => [item]catch me[/item]
            [2] => [item]catch me[/item]
        )

    [1] => Array
        (
            [0] => catch me
            [1] => catch me
            [2] => catch me
        )

)

$matches[1]包含您要查找的内容。

答案 1 :(得分:1)

如果我做对了,你可能需要分两步完成,比如:

$items_regex = '/\[block\]((?:\s*\[item\].*?\[/item\]\s*)+?)\[/block\]/';
$item_regex = '/\[item\](.*?)\[/item\]/';

if (preg_match($items_regex, $str, $items)) {
   $items = end($items);
   if (preg_match_all($item_regex, $items, $match)) {
     $match = end($match);
     // do stuff
   }
}