【问题标题】:Get all text between tags with preg_match_all() or better function?使用 preg_match_all() 或更好的函数获取标签之间的所有文本?
【发布时间】:2010-06-17 16:46:33
【问题描述】:
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

我正在尝试查找&lt;remove&gt; 标签之间的所有实例

这就是我所拥有的:

$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

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

【问题讨论】:

    标签: php regex preg-match-all


    【解决方案1】:

    不要使用正则表达式来解析 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];
        }
    }
    

    【讨论】:

    • 打败我,回收我的答案。但是,您不能从模式中删除捕获组(括号)吗? $pattern = "/&lt;remove&gt;.*?&lt;\/remove&gt;/";
    • 不,因为他说他想要标签之间的文本(因此你需要捕获子模式)。如果他只想要标签(和内容),那么您是正确的,不需要子模式。 (或者至少我是这么理解这个问题的)......
    • 完全没有需要捕获子模式。
    • 没错,您可以使用断言或非捕获子模式...所以更好的表达方式是您需要一个子模式(因为断言是子模式的一种形式)...公平吗?
    【解决方案2】:

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

    我遇到了同样的问题

    【讨论】:

      【解决方案3】:

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

      array_unique($matches);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        相关资源
        最近更新 更多