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

Php 使用preg_match_all()或更好的函数获取标记之间的所有文本?,php,regex,preg-match-all,Php,Regex,Preg Match All,为什么它会加倍,我如何防止它?不是正则表达式解决方案,但您可以像这样删除重复项: 2010-June-2 2010-June-3 2010-June-2 2010-June-3 不要使用正则表达式解析xml/html 话虽如此,问题在于匹配结构如下所示: array_unique($matches); 因此,与其做你的foreach,不如做一个: array( 0 => array('whole match1', 'whole match 2', 'whole match 3'

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

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

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

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

话虽如此,问题在于匹配结构如下所示:

array_unique($matches);
因此,与其做你的foreach,不如做一个:

array(
    0 => array('whole match1', 'whole match 2', 'whole match 3'),
    1 => array('subpattern match 1', 'subpattern match 2', 'subpattern match 3'),
);
或者使用
PREG\u SET\u ORDER
标志来PREG\u match\u all,这将产生如下数组结构:

if (!empty($matches)) { 
    foreach ($matches[1] as $value) {
        echo $value;
    }
}
那么你的祖先就会变成:

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

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


我也有同样的问题

抢先一步,重复我的答案。但是,您不能从模式中删除捕获组(括号)吗<代码>$pattern=“/.*?/”否,因为他说他需要标记之间的文本(因此需要捕获子模式)。如果他只是想要标签(和内容),那么您认为不需要子模式是正确的。(或者至少我是这样理解这个问题的)…根本不需要捕获子模式。没错,您可以使用断言或非捕获子模式。。。因此,更好的方法是需要一个子模式(因为断言是子模式的一种形式)。。。公平的
if (!empty($matches)) { 
    foreach ($matches[1] as $value) {
        echo $value;
    }
}
array( 
    0 => array('whole match1', 'subpattern match 1'),
    0 => array('whole match2', 'subpattern match 2'),
    0 => array('whole match3', 'subpattern match 3'),
);
if (!empty($matches)) { 
    foreach ($matches as $match) {
        echo $match[1];
    }
}