2
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

为什么它会加倍,我该如何防止呢?

4

3 回答 3

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_ORDERpreg_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];
    }
}
于 2010-06-17T16:53:49.180 回答
1

尝试使用$matches[0]而不仅仅是$matches.

我有同样的问题

于 2011-12-29T20:23:39.550 回答
0

不是正则表达式解决方案,但您可以像这样删除重复项:

array_unique($matches);
于 2010-06-17T16:48:54.573 回答