1

我有一个很大的 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. 所有那些重复的代码……这让我心痛。

所以我需要找到一种方法来使用 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#

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

4

2 回答 2

1

您可以为此使用交替

(?:red|green|blue)\">#</span>(.*?)<span class=\"close\">#</span>
于 2012-12-19T11:56:35.830 回答
0

它必须是“红色”、“绿色”、“蓝色”吗?不能是“颜色:任何东西”吗?

 preg_match_all("'color:.+?\">#</span>(.*?)<span class=\"close\">#</span>'si", $text, $match);
于 2012-12-19T11:58:22.313 回答