Использование preg_match_all с определенным шаблоном

У меня есть большой HTML-текст для анализа с помощью PHP-скрипта. Мне нужно найти (и распечатать на экране) текст между:

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

и

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

где ЦВЕТ может быть «красным», «зеленым» или «синим».

Я написал ТРИ цикла, каждый для любого цвета, поэтому мой код на данный момент следующий:

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. Весь этот повторяющийся код... у меня болит сердце.

Поэтому мне нужно было найти способ поиска всех частей текста с использованием условия ИЛИ.

Тогда я написал этот кусок кода:

$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#

Итак, я, очевидно, делаю что-то не так с шаблоном, но я не могу найти способ решить эту проблему. Любая помощь?


person Community    schedule 19.12.2012    source источник
comment
Обязательно: stackoverflow.com/questions/1732348/   -  person deceze♦    schedule 19.12.2012
comment
Очень забавный ответ, но я проанализировал свой HTML с помощью регулярных выражений.   -  person    schedule 17.04.2013


Ответы (2)


Вы можете использовать чередование для этого

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

это должно быть "красный", "зеленый", "синий"? разве это не может быть «цвет: ЧТО-НИБУДЬ»?

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