使用preg_match_all()或更好的函数获取标签之间的所有文本?

时间:2010-06-17 16:46:33

标签: php regex preg-match-all

2010-June-11
<remove>2010-June-2</remove>
<remove>2010-June-3</remove>
2010-June-15
2010-June-16
2010-June-17
2010-June-3
2010-June-2
2010-June-1

我正在尝试查找<remove>代码

之间的所有实例

这就是我所拥有的:

$pattern = "/<remove>(.*?)<\/remove>/";
preg_match_all($pattern, $_POST['exclude'], $matches);

foreach($matches as $deselect){
    foreach ($deselect as $display){
        echo $display."<br />";
    }
}

这就是它的回报:

2010-June-2
2010-June-3
2010-June-2
2010-June-3

为什么会加倍,我该如何防止这种情况?

3 个答案:

答案 0 :(得分:2)

不要使用正则表达式来解析xml / html ...

话虽如此,问题是因为匹配结构如下:

array(
    0 => array('whole match1', 'whole match 2', 'whole match 3'),
    1 => array('subpattern match 1', 'subpattern match 2', 'subpattern match 3'),
);

所以不要做你的foreach,而是做一个:

if (!empty($matches)) { 
    foreach ($matches[1] as $value) {
        echo $value;
    }
}

或使用PREG_SET_ORDER标志来preg_match_all,这将产生如下数组结构:

array( 
    0 => array('whole match1', 'subpattern match 1'),
    0 => array('whole match2', 'subpattern match 2'),
    0 => array('whole match3', 'subpattern match 3'),
);

那么你的foreach会变成:

if (!empty($matches)) { 
    foreach ($matches as $match) {
        echo $match[1];
    }
}

答案 1 :(得分:1)

尝试使用$matches[0]而非$matches

我遇到了同样的问题

答案 2 :(得分:0)

不是正则表达式解决方案,但您可以删除重复的内容:

array_unique($matches);