使用具有特定模式的preg_match_all

时间:2012-12-19 11:42:33

标签: php design-patterns preg-match-all

我有一个很大的HTML文本要用PHP脚本解析。我需要找到(并在屏幕上打印)之间的文字:

<span style="color:COLOR">#</span>

<span class="close">#</span>

其中COLOR可以是“红色”,“绿色”或“蓝色”。

我写了三个循环,每个循环都有颜色,所以我的代码目前如下:

preg_match_all("'red\">#</span>(.*?)<span class=\"close\">#</span>'si", $text, $match);
foreach($match[1] as $val) {
     echo $val;
}
preg_match_all("'green\">#</span>(.*?)<span class=\"close\">#</span>'si", $text, $match);
foreach($match[1] as $val) {
     echo $val;
}
preg_match_all("'blue\">#</span>(.*?)<span class=\"close\">#</span>'si", $text, $match);
foreach($match[1] as $val) {
     echo $val;
}

一切正常,但我有两个问题:

  1. 这样我就可以找到红色标签之间文本的所有部分,然后是绿色标签之间文本的所有部分,最后是蓝色标签之间文本的所有部分(但我想按照它们出现在文本中的确切顺序找到它们)文本)。
  2. 所有那些重复的代码......它让我心痛。
  3. 所以我需要找到一种方法来使用OR条件搜索文本的所有部分。

    然后我写了这段代码:

    $patterns = array(
        'green\">#<\/span>(.*?)<span class=\"close\">#<\/span>',
        'red\">#<\/span>(.*?)<span class=\"close\">#<\/span>',
        'blue\">#<\/span>(.*?)<span class=\"close\">#<\/span>'
    );
    
    $rule= '/(' .implode('|', $patterns) .')/i'; 
    
    $text = 'Lorem ipsum dolor sit amet, <span style="color:red">#</span>consectetur adipiscing elit<span class="close">#</span>. 
    Vestibulum ante lectus, <span style="color:green">#</span>pellentesque ac accumsan sit amet, posuere tempor<span class="close">#</span> ligula.';
    
    preg_match_all($rule, $text, $match);
    foreach($match[1] as $val) {
        echo "<pre>".$val."</pre><br />";
    }
    

    我期望在屏幕上找到的内容:

    consectetur adipiscing elit
    pellentesque ac accumsan sit amet, posuere tempor
    

    我真正得到的是:

    red">#consectetur adipiscing elit#
    green">#pellentesque ac accumsan sit amet, posuere tempor#
    

    所以,我显然对模式做错了,但我找不到解决这个问题的方法。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

您可以将alternation用于此

(?:red|green|blue)\">#</span>(.*?)<span class=\"close\">#</span>

答案 1 :(得分:0)

它必须是'红色','绿色','蓝色'?不能是'颜色:任何'?

 preg_match_all("'color:.+?\">#</span>(.*?)<span class=\"close\">#</span>'si", $text, $match);