preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_PATTERN_ORDER);
echo $out[0][0] . ", " . $out[0][1] . "\n";
echo $out[1][0] . ", " . $out[1][1] . "\n";
Результат работы примера:
<b>example: </b>, <div align=left>this is a test</div>
example: , this is a test
Вот можно объяснить на этом примере, в $out[0][0] у нас попадает вся строка которая удовлетворяет нашему шаблону, у нас получается таких строк две, это
<b>example: </b> и <div align=left>this is a test</div>, получается чтобы получить первую строку нужно обратиться к $out[0][0], а чтобы добраться до второй к $out[0][1] (то есть это <div align=left>this is a test</div>).
Также существуют подмаски, вот например в нашем примере это (.*) подмаска, выделяются подмаски при помощи круглых скобок, в таком случае вернется уже не вся строка, а только то, что указано в подмаске, в нашем примере текст (без тегов). Соответственно, чтобы получить "example:", который имеет индекс ноль в массиве нашей подмаски, мы должны обратиться к $out[1][0], а чтобы взять уже первый элемент из нашей подмаски, должны написать соответственно $out[1][1].
то есть если перевести на наш язык запись $out[1][1], будет звучать примерно так: Обратиться к первой подмаске и выбрать элемент из массива с индексом один.